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
|