Distribution/Types/ExecutableScope.hs

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

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

    import Prelude ()
    import Distribution.Compat.Prelude

    import Distribution.Text
    import qualified Distribution.Compat.ReadP as Parse

    import Text.PrettyPrint (text)

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

    instance Text ExecutableScope where
      disp ExecutablePublic  = text "public"
      disp ExecutablePrivate = text "private"
      disp ExecutableScopeUnknown = text "unknown"

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

    instance Binary ExecutableScope

    instance Monoid ExecutableScope where
        mempty = ExecutableScopeUnknown
        mappend = (<>)

    instance Semigroup ExecutableScope where
        ExecutableScopeUnknown <> x = x
        x <> ExecutableScopeUnknown = x
        x <> y | x == y             = x
               | otherwise          = error "Ambiguous executable scope"