Cabal-syntax-3.12.0.0: src/Distribution/Types/Component.hs
{-# LANGUAGE DeriveGeneric #-}
module Distribution.Types.Component
( Component (..)
, foldComponent
, componentBuildInfo
, componentBuildable
, componentName
, partitionComponents
) where
import Distribution.Compat.Prelude
import Prelude ()
import Distribution.Types.Benchmark
import Distribution.Types.Executable
import Distribution.Types.ForeignLib
import Distribution.Types.Library
import Distribution.Types.TestSuite
import Distribution.Types.BuildInfo
import Distribution.Types.ComponentName
import qualified Distribution.Types.BuildInfo.Lens as L
data Component
= CLib Library
| CFLib ForeignLib
| CExe Executable
| CTest TestSuite
| CBench Benchmark
deriving (Generic, Show, Eq, Read)
instance Binary Component
instance Structured Component
instance Semigroup Component where
CLib l <> CLib l' = CLib (l <> l')
CFLib l <> CFLib l' = CFLib (l <> l')
CExe e <> CExe e' = CExe (e <> e')
CTest t <> CTest t' = CTest (t <> t')
CBench b <> CBench b' = CBench (b <> b')
_ <> _ = error "Cannot merge Component"
instance L.HasBuildInfo Component where
buildInfo f (CLib l) = CLib <$> L.buildInfo f l
buildInfo f (CFLib l) = CFLib <$> L.buildInfo f l
buildInfo f (CExe e) = CExe <$> L.buildInfo f e
buildInfo f (CTest t) = CTest <$> L.buildInfo f t
buildInfo f (CBench b) = CBench <$> L.buildInfo f b
foldComponent
:: (Library -> a)
-> (ForeignLib -> a)
-> (Executable -> a)
-> (TestSuite -> a)
-> (Benchmark -> a)
-> Component
-> a
foldComponent f _ _ _ _ (CLib lib) = f lib
foldComponent _ f _ _ _ (CFLib flib) = f flib
foldComponent _ _ f _ _ (CExe exe) = f exe
foldComponent _ _ _ f _ (CTest tst) = f tst
foldComponent _ _ _ _ f (CBench bch) = f bch
componentBuildInfo :: Component -> BuildInfo
componentBuildInfo =
foldComponent libBuildInfo foreignLibBuildInfo buildInfo testBuildInfo benchmarkBuildInfo
-- | Is a component buildable (i.e., not marked with @buildable: False@)?
-- See also this note in
-- "Distribution.Types.ComponentRequestedSpec#buildable_vs_enabled_components".
--
-- @since 2.0.0.2
componentBuildable :: Component -> Bool
componentBuildable = buildable . componentBuildInfo
componentName :: Component -> ComponentName
componentName =
foldComponent
(CLibName . libName)
(CFLibName . foreignLibName)
(CExeName . exeName)
(CTestName . testName)
(CBenchName . benchmarkName)
partitionComponents
:: [Component]
-> ([Library], [ForeignLib], [Executable], [TestSuite], [Benchmark])
partitionComponents = foldr (foldComponent fa fb fc fd fe) ([], [], [], [], [])
where
fa x ~(a, b, c, d, e) = (x : a, b, c, d, e)
fb x ~(a, b, c, d, e) = (a, x : b, c, d, e)
fc x ~(a, b, c, d, e) = (a, b, x : c, d, e)
fd x ~(a, b, c, d, e) = (a, b, c, x : d, e)
fe x ~(a, b, c, d, e) = (a, b, c, d, x : e)