1- {-# LANGUAGE DeriveGeneric #-}
2- {-# LANGUAGE DeriveTraversable #-}
31{-# LANGUAGE FlexibleContexts #-}
2+ {-# LANGUAGE PatternSynonyms #-}
43
54-----------------------------------------------------------------------------
65
1918--
2019-- Split off from "Distribution.Simple.Setup" to break import cycles.
2120module Distribution.Simple.Flag
22- ( Flag (.. )
21+ ( Flag
22+ , pattern Flag
23+ , pattern NoFlag
2324 , allFlags
2425 , toFlag
2526 , fromFlag
@@ -32,6 +33,7 @@ module Distribution.Simple.Flag
3233 , BooleanFlag (.. )
3334 ) where
3435
36+ import Data.Monoid (Last (.. ))
3537import Distribution.Compat.Prelude hiding (get )
3638import Distribution.Compat.Stack
3739import Prelude ()
@@ -61,43 +63,15 @@ import Prelude ()
6163-- 'NoFlag' and later flags override earlier ones.
6264--
6365-- Isomorphic to 'Maybe' a.
64- data Flag a = Flag a | NoFlag deriving (Eq , Generic , Show , Read , Foldable , Traversable )
65-
66- instance Binary a => Binary (Flag a )
67- instance Structured a => Structured (Flag a )
68-
69- instance Functor Flag where
70- fmap f (Flag x) = Flag (f x)
71- fmap _ NoFlag = NoFlag
72-
73- instance Applicative Flag where
74- (Flag x) <*> y = x <$> y
75- NoFlag <*> _ = NoFlag
76- pure = Flag
77-
78- instance Monoid (Flag a ) where
79- mempty = NoFlag
80- mappend = (<>)
81-
82- instance Semigroup (Flag a ) where
83- _ <> f@ (Flag _) = f
84- f <> NoFlag = f
85-
86- instance Bounded a => Bounded (Flag a ) where
87- minBound = toFlag minBound
88- maxBound = toFlag maxBound
89-
90- instance Enum a => Enum (Flag a ) where
91- fromEnum = fromEnum . fromFlag
92- toEnum = toFlag . toEnum
93- enumFrom (Flag a) = map toFlag . enumFrom $ a
94- enumFrom _ = []
95- enumFromThen (Flag a) (Flag b) = toFlag `map` enumFromThen a b
96- enumFromThen _ _ = []
97- enumFromTo (Flag a) (Flag b) = toFlag `map` enumFromTo a b
98- enumFromTo _ _ = []
99- enumFromThenTo (Flag a) (Flag b) (Flag c) = toFlag `map` enumFromThenTo a b c
100- enumFromThenTo _ _ _ = []
66+ type Flag = Last
67+
68+ pattern Flag :: a -> Last a
69+ pattern Flag a = Last (Just a)
70+
71+ pattern NoFlag :: Last a
72+ pattern NoFlag = Last Nothing
73+
74+ {-# COMPLETE Flag, NoFlag #-}
10175
10276-- | Wraps a value in 'Flag'.
10377toFlag :: a -> Flag a
@@ -110,26 +84,22 @@ fromFlag NoFlag = error "fromFlag NoFlag. Use fromFlagOrDefault"
11084
11185-- | Extracts a value from a 'Flag', and returns the default value on 'NoFlag'.
11286fromFlagOrDefault :: a -> Flag a -> a
113- fromFlagOrDefault _ (Flag x) = x
114- fromFlagOrDefault def NoFlag = def
87+ fromFlagOrDefault def = fromMaybe def . getLast
11588
11689-- | Converts a 'Flag' value to a 'Maybe' value.
11790flagToMaybe :: Flag a -> Maybe a
118- flagToMaybe (Flag x) = Just x
119- flagToMaybe NoFlag = Nothing
91+ flagToMaybe = getLast
12092
12193-- | Pushes a function through a 'Flag' value, and returns a default
12294-- if the 'Flag' value is 'NoFlag'.
12395--
12496-- @since 3.4.0.0
12597flagElim :: b -> (a -> b ) -> Flag a -> b
126- flagElim n _ NoFlag = n
127- flagElim _ f (Flag x) = f x
98+ flagElim n f = maybe n f . getLast
12899
129100-- | Converts a 'Flag' value to a list.
130101flagToList :: Flag a -> [a ]
131- flagToList (Flag x) = [x]
132- flagToList NoFlag = []
102+ flagToList = maybeToList . getLast
133103
134104-- | Returns 'True' only if every 'Flag' 'Bool' value is Flag True, else 'False'.
135105allFlags :: [Flag Bool ] -> Flag Bool
@@ -140,8 +110,7 @@ allFlags flags =
140110
141111-- | Converts a 'Maybe' value to a 'Flag' value.
142112maybeToFlag :: Maybe a -> Flag a
143- maybeToFlag Nothing = NoFlag
144- maybeToFlag (Just x) = Flag x
113+ maybeToFlag = Last
145114
146115-- | Merge the elements of a list 'Flag' with another list 'Flag'.
147116mergeListFlag :: Flag [a ] -> Flag [a ] -> Flag [a ]
0 commit comments