Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Synopsis
- data CondTree v c a = CondNode {
- condTreeData :: a
- condTreeConstraints :: c
- condTreeComponents :: [CondBranch v c a]
- data CondBranch v c a = CondBranch {
- condBranchCondition :: Condition v
- condBranchIfTrue :: CondTree v c a
- condBranchIfFalse :: Maybe (CondTree v c a)
- condIfThen :: Condition v -> CondTree v c a -> CondBranch v c a
- condIfThenElse :: Condition v -> CondTree v c a -> CondTree v c a -> CondBranch v c a
- foldCondTree :: b -> ((c, a) -> b) -> (b -> b -> b) -> (b -> b -> b) -> CondTree v c a -> b
- mapCondTree :: (a -> b) -> (c -> d) -> (Condition v -> Condition w) -> CondTree v c a -> CondTree w d b
- mapTreeConstrs :: (c -> d) -> CondTree v c a -> CondTree v d a
- mapTreeConds :: (Condition v -> Condition w) -> CondTree v c a -> CondTree w c a
- mapTreeData :: (a -> b) -> CondTree v c a -> CondTree v c b
- traverseCondTreeV :: forall v c a w f. Applicative f => LensLike f (CondTree v c a) (CondTree w c a) v w
- traverseCondBranchV :: forall v c a w f. Applicative f => LensLike f (CondBranch v c a) (CondBranch w c a) v w
- traverseCondTreeC :: forall v c a d f. Applicative f => LensLike f (CondTree v c a) (CondTree v d a) c d
- traverseCondBranchC :: forall v c a d f. Applicative f => LensLike f (CondBranch v c a) (CondBranch v d a) c d
- extractCondition :: Eq v => (a -> Bool) -> CondTree v c a -> Condition v
- simplifyCondTree :: (Semigroup a, Semigroup d) => (v -> Either v Bool) -> CondTree v d a -> (d, a)
- ignoreConditions :: (Semigroup a, Semigroup c) => CondTree v c a -> (a, c)
Documentation
A CondTree
is used to represent the conditional structure of
a Cabal file, reflecting a syntax element subject to constraints,
and then any number of sub-elements which may be enabled subject
to some condition. Both a
and c
are usually Monoid
s.
To be more concrete, consider the following fragment of a Cabal
file:
build-depends: base >= 4.0 if flag(extra) build-depends: base >= 4.2
One way to represent this is to have
. Here, CondTree
ConfVar
[Dependency
] BuildInfo
condTreeData
represents
the actual fields which are not behind any conditional, while
condTreeComponents
recursively records any further fields
which are behind a conditional. condTreeConstraints
records
the constraints (in this case, base >= 4.0
) which would
be applied if you use this syntax; in general, this is
derived off of targetBuildInfo
(perhaps a good refactoring
would be to convert this into an opaque type, with a smart
constructor that pre-computes the dependencies.)
CondNode | |
|
Instances
Foldable (CondTree v c) Source # | |||||
Defined in Distribution.Types.CondTree fold :: Monoid m => CondTree v c m -> m Source # foldMap :: Monoid m => (a -> m) -> CondTree v c a -> m Source # foldMap' :: Monoid m => (a -> m) -> CondTree v c a -> m Source # foldr :: (a -> b -> b) -> b -> CondTree v c a -> b Source # foldr' :: (a -> b -> b) -> b -> CondTree v c a -> b Source # foldl :: (b -> a -> b) -> b -> CondTree v c a -> b Source # foldl' :: (b -> a -> b) -> b -> CondTree v c a -> b Source # foldr1 :: (a -> a -> a) -> CondTree v c a -> a Source # foldl1 :: (a -> a -> a) -> CondTree v c a -> a Source # toList :: CondTree v c a -> [a] Source # null :: CondTree v c a -> Bool Source # length :: CondTree v c a -> Int Source # elem :: Eq a => a -> CondTree v c a -> Bool Source # maximum :: Ord a => CondTree v c a -> a Source # minimum :: Ord a => CondTree v c a -> a Source # | |||||
Traversable (CondTree v c) Source # | |||||
Defined in Distribution.Types.CondTree traverse :: Applicative f => (a -> f b) -> CondTree v c a -> f (CondTree v c b) Source # sequenceA :: Applicative f => CondTree v c (f a) -> f (CondTree v c a) Source # mapM :: Monad m => (a -> m b) -> CondTree v c a -> m (CondTree v c b) Source # sequence :: Monad m => CondTree v c (m a) -> m (CondTree v c a) Source # | |||||
Functor (CondTree v c) Source # | |||||
(Structured v, Structured c, Structured a) => Structured (CondTree v c a) Source # | |||||
Defined in Distribution.Types.CondTree | |||||
(Data v, Data a, Data c) => Data (CondTree v c a) Source # | |||||
Defined in Distribution.Types.CondTree gfoldl :: (forall d b. Data d => c0 (d -> b) -> d -> c0 b) -> (forall g. g -> c0 g) -> CondTree v c a -> c0 (CondTree v c a) Source # gunfold :: (forall b r. Data b => c0 (b -> r) -> c0 r) -> (forall r. r -> c0 r) -> Constr -> c0 (CondTree v c a) Source # toConstr :: CondTree v c a -> Constr Source # dataTypeOf :: CondTree v c a -> DataType Source # dataCast1 :: Typeable t => (forall d. Data d => c0 (t d)) -> Maybe (c0 (CondTree v c a)) Source # dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c0 (t d e)) -> Maybe (c0 (CondTree v c a)) Source # gmapT :: (forall b. Data b => b -> b) -> CondTree v c a -> CondTree v c a Source # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> CondTree v c a -> r Source # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> CondTree v c a -> r Source # gmapQ :: (forall d. Data d => d -> u) -> CondTree v c a -> [u] Source # gmapQi :: Int -> (forall d. Data d => d -> u) -> CondTree v c a -> u Source # gmapM :: Monad m => (forall d. Data d => d -> m d) -> CondTree v c a -> m (CondTree v c a) Source # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> CondTree v c a -> m (CondTree v c a) Source # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> CondTree v c a -> m (CondTree v c a) Source # | |||||
(Semigroup a, Semigroup c, Monoid a, Monoid c) => Monoid (CondTree v c a) Source # | |||||
(Semigroup a, Semigroup c) => Semigroup (CondTree v c a) Source # | |||||
Generic (CondTree v c a) Source # | |||||
Defined in Distribution.Types.CondTree
| |||||
(Show a, Show c, Show v) => Show (CondTree v c a) Source # | |||||
(Binary v, Binary c, Binary a) => Binary (CondTree v c a) Source # | |||||
(NFData v, NFData c, NFData a) => NFData (CondTree v c a) Source # | |||||
Defined in Distribution.Types.CondTree | |||||
(Eq a, Eq c, Eq v) => Eq (CondTree v c a) Source # | |||||
type Rep (CondTree v c a) Source # | |||||
Defined in Distribution.Types.CondTree type Rep (CondTree v c a) = D1 ('MetaData "CondTree" "Distribution.Types.CondTree" "Cabal-syntax-3.10.3.0-9bb5" 'False) (C1 ('MetaCons "CondNode" 'PrefixI 'True) (S1 ('MetaSel ('Just "condTreeData") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a) :*: (S1 ('MetaSel ('Just "condTreeConstraints") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 c) :*: S1 ('MetaSel ('Just "condTreeComponents") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [CondBranch v c a])))) |
data CondBranch v c a Source #
A CondBranch
represents a conditional branch, e.g., if
flag(foo)
on some syntax a
. It also has an optional false
branch.
CondBranch | |
|
Instances
condIfThen :: Condition v -> CondTree v c a -> CondBranch v c a Source #
condIfThenElse :: Condition v -> CondTree v c a -> CondTree v c a -> CondBranch v c a Source #
foldCondTree :: b -> ((c, a) -> b) -> (b -> b -> b) -> (b -> b -> b) -> CondTree v c a -> b Source #
Flatten a CondTree. This will traverse the CondTree by taking all possible paths into account, but merging inclusive when two paths may co-exist, and exclusively when the paths are an if/else
mapCondTree :: (a -> b) -> (c -> d) -> (Condition v -> Condition w) -> CondTree v c a -> CondTree w d b Source #
mapTreeConstrs :: (c -> d) -> CondTree v c a -> CondTree v d a Source #
mapTreeData :: (a -> b) -> CondTree v c a -> CondTree v c b Source #
traverseCondTreeV :: forall v c a w f. Applicative f => LensLike f (CondTree v c a) (CondTree w c a) v w Source #
@Traversal
@ for the variables
traverseCondBranchV :: forall v c a w f. Applicative f => LensLike f (CondBranch v c a) (CondBranch w c a) v w Source #
@Traversal
@ for the variables
traverseCondTreeC :: forall v c a d f. Applicative f => LensLike f (CondTree v c a) (CondTree v d a) c d Source #
@Traversal
@ for the aggregated constraints
traverseCondBranchC :: forall v c a d f. Applicative f => LensLike f (CondBranch v c a) (CondBranch v d a) c d Source #
@Traversal
@ for the aggregated constraints
extractCondition :: Eq v => (a -> Bool) -> CondTree v c a -> Condition v Source #
Extract the condition matched by the given predicate from a cond tree.
We use this mainly for extracting buildable conditions (see the Note in Distribution.PackageDescription.Configuration), but the function is in fact more general.