module Distribution.Types.Executable (
    Executable(..),
    emptyExecutable,
    exeModules,
    exeModulesAutogen
) where
import Prelude ()
import Distribution.Compat.Prelude
import Distribution.Types.BuildInfo
import Distribution.Types.UnqualComponentName
import Distribution.Types.ExecutableScope
import Distribution.ModuleName
import qualified Distribution.Types.BuildInfo.Lens as L
data Executable = Executable {
        exeName    :: UnqualComponentName,
        modulePath :: FilePath,
        exeScope   :: ExecutableScope,
        buildInfo  :: BuildInfo
    }
    deriving (Generic, Show, Read, Eq, Typeable, Data)
instance L.HasBuildInfo Executable where
    buildInfo f l = (\x -> l { buildInfo = x }) <$> f (buildInfo l)
instance Binary Executable
instance NFData Executable where rnf = genericRnf
instance Monoid Executable where
  mempty = gmempty
  mappend = (<>)
instance Semigroup Executable where
  a <> b = Executable{
    exeName    = combine' exeName,
    modulePath = combine modulePath,
    exeScope   = combine exeScope,
    buildInfo  = combine buildInfo
  }
    where combine field = field a `mappend` field b
          combine' field = case ( unUnqualComponentName $ field a
                                , unUnqualComponentName $ field b) of
                      ("", _) -> field b
                      (_, "") -> field a
                      (x, y) -> error $ "Ambiguous values for executable field: '"
                                  ++ x ++ "' and '" ++ y ++ "'"
emptyExecutable :: Executable
emptyExecutable = mempty
exeModules :: Executable -> [ModuleName]
exeModules exe = otherModules (buildInfo exe)
exeModulesAutogen :: Executable -> [ModuleName]
exeModulesAutogen exe = autogenModules (buildInfo exe)