1{-# Language CPP #-}
2module Basement.Numerical.Number
3    ( IsIntegral(..)
4    , IsNatural(..)
5    ) where
6
7import           Basement.Compat.Base
8import           Basement.Compat.C.Types
9import           Basement.Compat.Natural
10import           Basement.Compat.NumLiteral
11import           Data.Bits
12import qualified Prelude
13
14-- | Number literals, convertible through the generic Integer type.
15--
16-- all number are Enum'erable, meaning that you can move to
17-- next element
18class (Integral a, Eq a, Ord a) => IsIntegral a where
19    {-# MINIMAL toInteger #-}
20    toInteger :: a -> Integer
21
22-- | Non Negative Number literals, convertible through the generic Natural type
23class IsIntegral a => IsNatural a where
24    {-# MINIMAL toNatural #-}
25    toNatural :: a -> Natural
26
27instance IsIntegral Integer where
28    toInteger i = i
29instance IsIntegral Int where
30    toInteger i = Prelude.toInteger i
31instance IsIntegral Int8 where
32    toInteger i = Prelude.toInteger i
33instance IsIntegral Int16 where
34    toInteger i = Prelude.toInteger i
35instance IsIntegral Int32 where
36    toInteger i = Prelude.toInteger i
37instance IsIntegral Int64 where
38    toInteger i = Prelude.toInteger i
39instance IsIntegral Natural where
40    toInteger i = Prelude.toInteger i
41instance IsIntegral Word where
42    toInteger i = Prelude.toInteger i
43instance IsIntegral Word8 where
44    toInteger i = Prelude.toInteger i
45instance IsIntegral Word16 where
46    toInteger i = Prelude.toInteger i
47instance IsIntegral Word32 where
48    toInteger i = Prelude.toInteger i
49instance IsIntegral Word64 where
50    toInteger i = Prelude.toInteger i
51
52instance IsIntegral CChar where
53    toInteger i = Prelude.toInteger i
54instance IsIntegral CSChar where
55    toInteger i = Prelude.toInteger i
56instance IsIntegral CUChar where
57    toInteger i = Prelude.toInteger i
58instance IsIntegral CShort where
59    toInteger i = Prelude.toInteger i
60instance IsIntegral CUShort where
61    toInteger i = Prelude.toInteger i
62instance IsIntegral CInt where
63    toInteger i = Prelude.toInteger i
64instance IsIntegral CUInt where
65    toInteger i = Prelude.toInteger i
66instance IsIntegral CLong where
67    toInteger i = Prelude.toInteger i
68instance IsIntegral CULong where
69    toInteger i = Prelude.toInteger i
70instance IsIntegral CPtrdiff where
71    toInteger i = Prelude.toInteger i
72instance IsIntegral CSize where
73    toInteger i = Prelude.toInteger i
74instance IsIntegral CWchar where
75    toInteger i = Prelude.toInteger i
76instance IsIntegral CSigAtomic where
77    toInteger i = Prelude.toInteger i
78instance IsIntegral CLLong where
79    toInteger i = Prelude.toInteger i
80instance IsIntegral CULLong where
81    toInteger i = Prelude.toInteger i
82#if MIN_VERSION_base(4,10,0)
83instance IsIntegral CBool where
84    toInteger i = Prelude.toInteger i
85#endif
86instance IsIntegral CIntPtr where
87    toInteger i = Prelude.toInteger i
88instance IsIntegral CUIntPtr where
89    toInteger i = Prelude.toInteger i
90instance IsIntegral CIntMax where
91    toInteger i = Prelude.toInteger i
92instance IsIntegral CUIntMax where
93    toInteger i = Prelude.toInteger i
94
95instance IsNatural Natural where
96    toNatural i = i
97instance IsNatural Word where
98    toNatural i = Prelude.fromIntegral i
99instance IsNatural Word8 where
100    toNatural i = Prelude.fromIntegral i
101instance IsNatural Word16 where
102    toNatural i = Prelude.fromIntegral i
103instance IsNatural Word32 where
104    toNatural i = Prelude.fromIntegral i
105instance IsNatural Word64 where
106    toNatural i = Prelude.fromIntegral i
107
108instance IsNatural CUChar where
109    toNatural i = Prelude.fromIntegral i
110instance IsNatural CUShort where
111    toNatural i = Prelude.fromIntegral i
112instance IsNatural CUInt where
113    toNatural i = Prelude.fromIntegral i
114instance IsNatural CULong where
115    toNatural i = Prelude.fromIntegral i
116instance IsNatural CSize where
117    toNatural i = Prelude.fromIntegral i
118instance IsNatural CULLong where
119    toNatural i = Prelude.fromIntegral i
120instance IsNatural CUIntPtr where
121    toNatural i = Prelude.fromIntegral i
122instance IsNatural CUIntMax where
123    toNatural i = Prelude.fromIntegral i
124