1
- {-# LANGUAGE DeriveGeneric #-}
2
- {-# LANGUAGE DeriveTraversable #-}
3
1
{-# LANGUAGE FlexibleContexts #-}
2
+ {-# LANGUAGE PatternSynonyms #-}
4
3
5
4
-----------------------------------------------------------------------------
6
5
19
18
--
20
19
-- Split off from "Distribution.Simple.Setup" to break import cycles.
21
20
module Distribution.Simple.Flag
22
- ( Flag (.. )
21
+ ( Flag
22
+ , pattern Flag
23
+ , pattern NoFlag
23
24
, allFlags
24
25
, toFlag
25
26
, fromFlag
@@ -32,6 +33,7 @@ module Distribution.Simple.Flag
32
33
, BooleanFlag (.. )
33
34
) where
34
35
36
+ import Data.Monoid (Last (.. ))
35
37
import Distribution.Compat.Prelude hiding (get )
36
38
import Distribution.Compat.Stack
37
39
import Prelude ()
@@ -61,43 +63,15 @@ import Prelude ()
61
63
-- 'NoFlag' and later flags override earlier ones.
62
64
--
63
65
-- 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 #-}
101
75
102
76
-- | Wraps a value in 'Flag'.
103
77
toFlag :: a -> Flag a
@@ -110,26 +84,22 @@ fromFlag NoFlag = error "fromFlag NoFlag. Use fromFlagOrDefault"
110
84
111
85
-- | Extracts a value from a 'Flag', and returns the default value on 'NoFlag'.
112
86
fromFlagOrDefault :: a -> Flag a -> a
113
- fromFlagOrDefault _ (Flag x) = x
114
- fromFlagOrDefault def NoFlag = def
87
+ fromFlagOrDefault def = fromMaybe def . getLast
115
88
116
89
-- | Converts a 'Flag' value to a 'Maybe' value.
117
90
flagToMaybe :: Flag a -> Maybe a
118
- flagToMaybe (Flag x) = Just x
119
- flagToMaybe NoFlag = Nothing
91
+ flagToMaybe = getLast
120
92
121
93
-- | Pushes a function through a 'Flag' value, and returns a default
122
94
-- if the 'Flag' value is 'NoFlag'.
123
95
--
124
96
-- @since 3.4.0.0
125
97
flagElim :: 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
128
99
129
100
-- | Converts a 'Flag' value to a list.
130
101
flagToList :: Flag a -> [a ]
131
- flagToList (Flag x) = [x]
132
- flagToList NoFlag = []
102
+ flagToList = maybeToList . getLast
133
103
134
104
-- | Returns 'True' only if every 'Flag' 'Bool' value is Flag True, else 'False'.
135
105
allFlags :: [Flag Bool ] -> Flag Bool
@@ -140,8 +110,7 @@ allFlags flags =
140
110
141
111
-- | Converts a 'Maybe' value to a 'Flag' value.
142
112
maybeToFlag :: Maybe a -> Flag a
143
- maybeToFlag Nothing = NoFlag
144
- maybeToFlag (Just x) = Flag x
113
+ maybeToFlag = Last
145
114
146
115
-- | Merge the elements of a list 'Flag' with another list 'Flag'.
147
116
mergeListFlag :: Flag [a ] -> Flag [a ] -> Flag [a ]
0 commit comments