File: NormalForm.hs

package info (click to toggle)
haskell-basement 0.0.16-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,048 kB
  • sloc: haskell: 11,336; ansic: 63; makefile: 5
file content (131 lines) | stat: -rw-r--r-- 5,291 bytes parent folder | download | duplicates (4)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module Basement.NormalForm
    ( NormalForm(..)
    , deepseq
    , force
    ) where

import Basement.Compat.Base
import Basement.Compat.C.Types
import Basement.Compat.Natural
import Basement.Types.OffsetSize
import Basement.Types.Char7
import Basement.Types.Word128 (Word128)
import Basement.Types.Word256 (Word256)
import Basement.Bounded
import Basement.Endianness

-- | Data that can be fully evaluated in Normal Form
--
class NormalForm a where
    toNormalForm :: a -> ()

deepseq :: NormalForm a => a -> b -> b
deepseq a b = toNormalForm a `seq` b

force :: NormalForm a => a -> a
force a = toNormalForm a `seq` a

-----
-- GHC / base types

instance NormalForm Int8    where toNormalForm !_ = ()
instance NormalForm Int16   where toNormalForm !_ = ()
instance NormalForm Int32   where toNormalForm !_ = ()
instance NormalForm Int64   where toNormalForm !_ = ()
instance NormalForm Int     where toNormalForm !_ = ()
instance NormalForm Integer where toNormalForm !_ = ()

instance NormalForm Word8   where toNormalForm !_ = ()
instance NormalForm Word16  where toNormalForm !_ = ()
instance NormalForm Word32  where toNormalForm !_ = ()
instance NormalForm Word64  where toNormalForm !_ = ()
instance NormalForm Word    where toNormalForm !_ = ()
instance NormalForm Natural where toNormalForm !_ = ()

instance NormalForm Float  where toNormalForm !_ = ()
instance NormalForm Double where toNormalForm !_ = ()

instance NormalForm Char where toNormalForm !_ = ()
instance NormalForm Bool where toNormalForm !_ = ()
instance NormalForm ()   where toNormalForm !_ = ()

-----
-- C Types
instance NormalForm CChar  where toNormalForm !_ = ()
instance NormalForm CUChar where toNormalForm !_ = ()
instance NormalForm CSChar where toNormalForm !_ = ()

instance NormalForm CShort  where toNormalForm !_ = ()
instance NormalForm CUShort where toNormalForm !_ = ()
instance NormalForm CInt    where toNormalForm !_ = ()
instance NormalForm CUInt   where toNormalForm !_ = ()
instance NormalForm CLong   where toNormalForm !_ = ()
instance NormalForm CULong  where toNormalForm !_ = ()
instance NormalForm CLLong  where toNormalForm !_ = ()
instance NormalForm CULLong where toNormalForm !_ = ()

instance NormalForm CFloat  where toNormalForm !_ = ()
instance NormalForm CDouble where toNormalForm !_ = ()

instance NormalForm (Ptr a) where toNormalForm !_ = ()

-----
-- Basic Foundation primitive types
instance NormalForm (Offset a) where toNormalForm !_ = ()
instance NormalForm (CountOf a) where toNormalForm !_ = ()

instance NormalForm Char7 where toNormalForm !_ = ()
instance NormalForm Word128 where toNormalForm !_ = ()
instance NormalForm Word256 where toNormalForm !_ = ()
instance NormalForm (Zn n) where toNormalForm = toNormalForm . unZn
instance NormalForm (Zn64 n) where toNormalForm = toNormalForm . unZn64

-----
-- composed type

instance NormalForm a => NormalForm (Maybe a) where
    toNormalForm Nothing  = ()
    toNormalForm (Just a) = toNormalForm a `seq` ()
instance (NormalForm l, NormalForm r) => NormalForm (Either l r) where
    toNormalForm (Left l)  = toNormalForm l `seq` ()
    toNormalForm (Right r) = toNormalForm r `seq` ()
instance NormalForm a => NormalForm (LE a) where
    toNormalForm (LE a) = toNormalForm a `seq` ()
instance NormalForm a => NormalForm (BE a) where
    toNormalForm (BE a) = toNormalForm a `seq` ()

instance NormalForm a => NormalForm [a] where
    toNormalForm []     = ()
    toNormalForm (x:xs) = toNormalForm x `seq` toNormalForm xs

instance (NormalForm a, NormalForm b) => NormalForm (a,b) where
    toNormalForm (a,b) = toNormalForm a `seq` toNormalForm b

instance (NormalForm a, NormalForm b, NormalForm c) => NormalForm (a,b,c) where
    toNormalForm (a,b,c) = toNormalForm a `seq` toNormalForm b `seq` toNormalForm c

instance (NormalForm a, NormalForm b, NormalForm c, NormalForm d) => NormalForm (a,b,c,d) where
    toNormalForm (a,b,c,d) = toNormalForm a `seq` toNormalForm b `seq` toNormalForm c `seq` toNormalForm d

instance (NormalForm a, NormalForm b, NormalForm c, NormalForm d, NormalForm e)
      => NormalForm (a,b,c,d,e) where
    toNormalForm (a,b,c,d,e) =
        toNormalForm a `seq` toNormalForm b `seq` toNormalForm c `seq` toNormalForm d `seq`
        toNormalForm e

instance (NormalForm a, NormalForm b, NormalForm c, NormalForm d, NormalForm e, NormalForm f)
      => NormalForm (a,b,c,d,e,f) where
    toNormalForm (a,b,c,d,e,f) =
        toNormalForm a `seq` toNormalForm b `seq` toNormalForm c `seq` toNormalForm d `seq`
        toNormalForm e `seq` toNormalForm f

instance (NormalForm a, NormalForm b, NormalForm c, NormalForm d, NormalForm e, NormalForm f, NormalForm g)
      => NormalForm (a,b,c,d,e,f,g) where
    toNormalForm (a,b,c,d,e,f,g) =
        toNormalForm a `seq` toNormalForm b `seq` toNormalForm c `seq` toNormalForm d `seq`
        toNormalForm e `seq` toNormalForm f `seq` toNormalForm g
instance (NormalForm a, NormalForm b, NormalForm c, NormalForm d, NormalForm e, NormalForm f, NormalForm g, NormalForm h)
      => NormalForm (a,b,c,d,e,f,g,h) where
    toNormalForm (a,b,c,d,e,f,g,h) =
        toNormalForm a `seq` toNormalForm b `seq` toNormalForm c `seq` toNormalForm d `seq`
        toNormalForm e `seq` toNormalForm f `seq` toNormalForm g `seq` toNormalForm h