{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

module Distribution.Types.ExecutableScope (
    ExecutableScope(..),
) where

import Prelude ()
import Distribution.Compat.Prelude

import Distribution.Pretty
import Distribution.Parsec.Class
import Distribution.Text

import qualified Distribution.Compat.CharParsing as P
import qualified Distribution.Compat.ReadP as Parse
import qualified Text.PrettyPrint as Disp

data ExecutableScope = ExecutablePublic
                     | ExecutablePrivate
    deriving (Generic, Show, Read, Eq, Typeable, Data)

instance Pretty ExecutableScope where
    pretty ExecutablePublic       = Disp.text "public"
    pretty ExecutablePrivate      = Disp.text "private"

instance Parsec ExecutableScope where
    parsec = P.try pub <|> pri where
        pub = ExecutablePublic  <$ P.string "public"
        pri = ExecutablePrivate <$ P.string "private"

instance Text ExecutableScope where
    parse = Parse.choice
        [ Parse.string "public"  >> return ExecutablePublic
        , Parse.string "private" >> return ExecutablePrivate
        ]

instance Binary ExecutableScope

instance NFData ExecutableScope where rnf = genericRnf

-- | 'Any' like semigroup, where 'ExecutablePrivate' is 'Any True'
instance Semigroup ExecutableScope where
    ExecutablePublic    <> x = x
    x@ExecutablePrivate <> _ = x

-- | 'mempty' = 'ExecutablePublic'
instance Monoid ExecutableScope where
    mempty = ExecutablePublic
    mappend = (<>)