7
7
-- | This module defines the MonoidNull class and some of its instances.
8
8
--
9
9
10
- {-# LANGUAGE Haskell2010, FlexibleInstances, Trustworthy #-}
10
+ {-# LANGUAGE Haskell2010, CPP, FlexibleInstances, DefaultSignatures , Trustworthy #-}
11
11
12
12
module Data.Monoid.Null (
13
13
MonoidNull (.. ), PositiveMonoid
14
14
)
15
15
where
16
16
17
+ import Data.Functor.Compose (Compose (.. ))
18
+ import Data.Functor.Const (Const (.. ))
19
+ import Data.Functor.Identity (Identity (.. ))
17
20
import Data.Monoid -- (Monoid, First(..), Last(..), Dual(..), Sum(..), Product(..), All(getAll), Any(getAny))
21
+ import Data.Ord (Down (.. ))
22
+ import Data.Proxy (Proxy )
23
+ import Data.Semigroup (Max , Min , WrappedMonoid (.. ))
24
+ import qualified Data.Functor.Product as Functor
18
25
import qualified Data.List as List
19
26
import qualified Data.ByteString as ByteString
20
27
import qualified Data.ByteString.Lazy as LazyByteString
@@ -26,6 +33,7 @@ import qualified Data.Map as Map
26
33
import qualified Data.Sequence as Sequence
27
34
import qualified Data.Set as Set
28
35
import qualified Data.Vector as Vector
36
+ import GHC.Generics ((:*:) (.. ), (:.:) (.. ), K1 (.. ), M1 (.. ), Par1 (.. ), Rec1 (.. ), U1 )
29
37
import Numeric.Natural (Natural )
30
38
31
39
import Prelude hiding (null )
@@ -75,10 +83,78 @@ instance (Num a, Eq a) => MonoidNull (Sum a) where
75
83
instance (Num a , Eq a ) => MonoidNull (Product a ) where
76
84
null (Product a) = a == 1
77
85
86
+ -- | @since 1.2.5.0
87
+ instance (Ord a , Bounded a ) => MonoidNull (Max a )
88
+
89
+ -- | @since 1.2.5.0
90
+ instance (Ord a , Bounded a ) => MonoidNull (Min a )
91
+
78
92
instance Monoid a => MonoidNull (Maybe a ) where
79
93
null Nothing = True
80
94
null _ = False
81
95
96
+ #if MIN_VERSION_base(4, 11, 0)
97
+ -- | @since 1.2.5.0
98
+ instance MonoidNull a => MonoidNull (Down a ) where
99
+ null (Down a) = null a
100
+ #endif
101
+
102
+ #if MIN_VERSION_base(4, 12, 0)
103
+ -- | @since 1.2.5.0
104
+ instance MonoidNull c => MonoidNull (K1 i c p ) where
105
+ null (K1 c) = null c
106
+
107
+ -- | @since 1.2.5.0
108
+ instance MonoidNull (f p ) => MonoidNull (M1 i c f p ) where
109
+ null (M1 fp) = null fp
110
+
111
+ -- | @since 1.2.5.0
112
+ instance MonoidNull p => MonoidNull (Par1 p ) where
113
+ null (Par1 p) = null p
114
+
115
+ -- | @since 1.2.5.0
116
+ instance MonoidNull (f p ) => MonoidNull (Rec1 f p ) where
117
+ null (Rec1 fp) = null fp
118
+
119
+ -- | @since 1.2.5.0
120
+ instance MonoidNull (U1 p ) where
121
+ null _ = True
122
+
123
+ -- | @since 1.2.5.0
124
+ instance (MonoidNull (f p ), MonoidNull (g p )) => MonoidNull ((:*: ) f g p ) where
125
+ null (fp :*: gp) = null fp && null gp
126
+
127
+ -- | @since 1.2.5.0
128
+ instance (MonoidNull (f (g p ))) => MonoidNull ((:.: ) f g p ) where
129
+ null (Comp1 fgp) = null fgp
130
+ #endif
131
+
132
+ #if MIN_VERSION_base(4, 16, 0)
133
+ -- | @since 1.2.5.0
134
+ instance MonoidNull (f (g a )) => MonoidNull (Compose f g a ) where
135
+ null (Compose fga) = null fga
136
+
137
+ -- | @since 1.2.5.0
138
+ instance (MonoidNull (f a ), MonoidNull (g a )) => MonoidNull (Functor. Product f g a ) where
139
+ null (Functor. Pair fa ga) = null fa && null ga
140
+ #endif
141
+
142
+ -- | @since 1.2.5.0
143
+ instance MonoidNull r => MonoidNull (Const r a ) where
144
+ null (Const r) = null r
145
+
146
+ -- | @since 1.2.5.0
147
+ instance MonoidNull a => MonoidNull (Identity a ) where
148
+ null (Identity a) = null a
149
+
150
+ -- | @since 1.2.5.0
151
+ instance MonoidNull a => MonoidNull (WrappedMonoid a ) where
152
+ null (WrapMonoid a) = null a
153
+
154
+ -- | @since 1.2.5.0
155
+ instance MonoidNull (Proxy a ) where
156
+ null _ = True
157
+
82
158
instance (MonoidNull a , MonoidNull b ) => MonoidNull (a , b ) where
83
159
null (a, b) = null a && null b
84
160
@@ -88,6 +164,10 @@ instance (MonoidNull a, MonoidNull b, MonoidNull c) => MonoidNull (a, b, c) wher
88
164
instance (MonoidNull a , MonoidNull b , MonoidNull c , MonoidNull d ) => MonoidNull (a , b , c , d ) where
89
165
null (a, b, c, d) = null a && null b && null c && null d
90
166
167
+ -- | @since 1.2.5.0
168
+ instance (MonoidNull a , MonoidNull b , MonoidNull c , MonoidNull d , MonoidNull e ) => MonoidNull (a , b , c , d , e ) where
169
+ null (a, b, c, d, e) = null a && null b && null c && null d && null e
170
+
91
171
instance MonoidNull [x ] where
92
172
null = List. null
93
173
@@ -135,6 +215,10 @@ instance PositiveMonoid Text.Text
135
215
instance PositiveMonoid LazyText. Text
136
216
instance PositiveMonoid (Product Natural )
137
217
instance PositiveMonoid (Sum Natural )
218
+ -- | @since 1.2.5.0
219
+ instance (Ord a , Bounded a ) => PositiveMonoid (Min a )
220
+ -- | @since 1.2.5.0
221
+ instance (Ord a , Bounded a ) => PositiveMonoid (Max a )
138
222
instance Monoid a => PositiveMonoid (Maybe a )
139
223
instance PositiveMonoid (First a )
140
224
instance PositiveMonoid (Last a )
@@ -146,6 +230,39 @@ instance PositiveMonoid IntSet.IntSet
146
230
instance PositiveMonoid (Sequence. Seq a )
147
231
instance Ord a => PositiveMonoid (Set. Set a )
148
232
instance PositiveMonoid (Vector. Vector a )
233
+ -- | @since 1.2.5.0
234
+ instance PositiveMonoid r => PositiveMonoid (Const r a )
235
+ -- | @since 1.2.5.0
236
+ instance PositiveMonoid a => PositiveMonoid (Identity a )
237
+ -- | @since 1.2.5.0
238
+ instance PositiveMonoid a => PositiveMonoid (WrappedMonoid a )
239
+ -- | @since 1.2.5.0
240
+ instance PositiveMonoid (Proxy a )
241
+
242
+ #if MIN_VERSION_base(4, 11, 0)
243
+ -- | @since 1.2.5.0
244
+ instance PositiveMonoid a => PositiveMonoid (Down a )
245
+ #endif
246
+
247
+ #if MIN_VERSION_base(4, 12, 0)
248
+ -- | @since 1.2.5.0
249
+ instance PositiveMonoid c => PositiveMonoid (K1 i c p )
250
+ -- | @since 1.2.5.0
251
+ instance PositiveMonoid (f p ) => PositiveMonoid (M1 i c f p )
252
+ -- | @since 1.2.5.0
253
+ instance PositiveMonoid p => PositiveMonoid (Par1 p )
254
+ -- | @since 1.2.5.0
255
+ instance PositiveMonoid (f p ) => PositiveMonoid (Rec1 f p )
256
+ -- | @since 1.2.5.0
257
+ instance PositiveMonoid (U1 p )
258
+ -- | @since 1.2.5.0
259
+ instance (PositiveMonoid (f (g p ))) => PositiveMonoid ((:.: ) f g p )
260
+ #endif
261
+
262
+ #if MIN_VERSION_base(4, 16, 0)
263
+ -- | @since 1.2.5.0
264
+ instance PositiveMonoid (f (g a )) => PositiveMonoid (Compose f g a )
265
+ #endif
149
266
150
267
-- The possible tuple instances would be overlapping, so we leave the choice to the user.
151
268
--
0 commit comments