1{-# LANGUAGE NoImplicitPrelude #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Stack.Types.NamedComponent
4  ( NamedComponent (..)
5  , renderComponent
6  , renderPkgComponents
7  , renderPkgComponent
8  , exeComponents
9  , testComponents
10  , benchComponents
11  , internalLibComponents
12  , isCLib
13  , isCInternalLib
14  , isCExe
15  , isCTest
16  , isCBench
17  ) where
18
19import Pantry
20import Stack.Prelude
21import qualified Data.Set as Set
22import qualified Data.Text as T
23
24-- | A single, fully resolved component of a package
25data NamedComponent
26    = CLib
27    | CInternalLib !Text
28    | CExe !Text
29    | CTest !Text
30    | CBench !Text
31    deriving (Show, Eq, Ord)
32
33renderComponent :: NamedComponent -> Text
34renderComponent CLib = "lib"
35renderComponent (CInternalLib x) = "internal-lib:" <> x
36renderComponent (CExe x) = "exe:" <> x
37renderComponent (CTest x) = "test:" <> x
38renderComponent (CBench x) = "bench:" <> x
39
40renderPkgComponents :: [(PackageName, NamedComponent)] -> Text
41renderPkgComponents = T.intercalate " " . map renderPkgComponent
42
43renderPkgComponent :: (PackageName, NamedComponent) -> Text
44renderPkgComponent (pkg, comp) = fromString (packageNameString pkg) <> ":" <> renderComponent comp
45
46exeComponents :: Set NamedComponent -> Set Text
47exeComponents = Set.fromList . mapMaybe mExeName . Set.toList
48  where
49    mExeName (CExe name) = Just name
50    mExeName _ = Nothing
51
52testComponents :: Set NamedComponent -> Set Text
53testComponents = Set.fromList . mapMaybe mTestName . Set.toList
54  where
55    mTestName (CTest name) = Just name
56    mTestName _ = Nothing
57
58benchComponents :: Set NamedComponent -> Set Text
59benchComponents = Set.fromList . mapMaybe mBenchName . Set.toList
60  where
61    mBenchName (CBench name) = Just name
62    mBenchName _ = Nothing
63
64internalLibComponents :: Set NamedComponent -> Set Text
65internalLibComponents = Set.fromList . mapMaybe mInternalName . Set.toList
66  where
67    mInternalName (CInternalLib name) = Just name
68    mInternalName _ = Nothing
69
70isCLib :: NamedComponent -> Bool
71isCLib CLib{} = True
72isCLib _ = False
73
74isCInternalLib :: NamedComponent -> Bool
75isCInternalLib CInternalLib{} = True
76isCInternalLib _ = False
77
78isCExe :: NamedComponent -> Bool
79isCExe CExe{} = True
80isCExe _ = False
81
82isCTest :: NamedComponent -> Bool
83isCTest CTest{} = True
84isCTest _ = False
85
86isCBench :: NamedComponent -> Bool
87isCBench CBench{} = True
88isCBench _ = False
89