-
Notifications
You must be signed in to change notification settings - Fork 88
/
Generic.purs
56 lines (40 loc) · 1.86 KB
/
Generic.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
module Data.Bounded.Generic
( class GenericBottom
, genericBottom'
, genericBottom
, class GenericTop
, genericTop'
, genericTop
) where
import Data.Generic.Rep
import Data.Bounded (class Bounded, bottom, top)
class GenericBottom a where
genericBottom' :: a
instance genericBottomNoArguments :: GenericBottom NoArguments where
genericBottom' = NoArguments
instance genericBottomArgument :: Bounded a => GenericBottom (Argument a) where
genericBottom' = Argument bottom
instance genericBottomSum :: GenericBottom a => GenericBottom (Sum a b) where
genericBottom' = Inl genericBottom'
instance genericBottomProduct :: (GenericBottom a, GenericBottom b) => GenericBottom (Product a b) where
genericBottom' = Product genericBottom' genericBottom'
instance genericBottomConstructor :: GenericBottom a => GenericBottom (Constructor name a) where
genericBottom' = Constructor genericBottom'
class GenericTop a where
genericTop' :: a
instance genericTopNoArguments :: GenericTop NoArguments where
genericTop' = NoArguments
instance genericTopArgument :: Bounded a => GenericTop (Argument a) where
genericTop' = Argument top
instance genericTopSum :: GenericTop b => GenericTop (Sum a b) where
genericTop' = Inr genericTop'
instance genericTopProduct :: (GenericTop a, GenericTop b) => GenericTop (Product a b) where
genericTop' = Product genericTop' genericTop'
instance genericTopConstructor :: GenericTop a => GenericTop (Constructor name a) where
genericTop' = Constructor genericTop'
-- | A `Generic` implementation of the `bottom` member from the `Bounded` type class.
genericBottom :: forall a rep. Generic a rep => GenericBottom rep => a
genericBottom = to genericBottom'
-- | A `Generic` implementation of the `top` member from the `Bounded` type class.
genericTop :: forall a rep. Generic a rep => GenericTop rep => a
genericTop = to genericTop'