4 _integer_0, _integer_1, _integer_m1
11 import ITup2 -- instances
12 import List ( (++), foldr )
13 import Prel ( not, otherwise, (&&) )
14 import PS ( _PackedString, _unpackPS )
17 ------------------------------------------------------
18 -- a magical Integer-ish function that
19 -- the compiler inserts references to
21 int2Integer :: Int -> Integer
22 int2Integer (I# i#) = int2Integer# i#
24 ------------------------------------------------------
25 -- some *very* heavily-used constants
27 _integer_0, _integer_1, _integer_m1 :: Integer
32 ------------------------------------------------------
34 instance Eq Integer where
35 (J# a1 s1 d1) == (J# a2 s2 d2)
36 = (cmpInteger# a1 s1 d1 a2 s2 d2) ==# 0#
38 (J# a1 s1 d1) /= (J# a2 s2 d2)
39 = (cmpInteger# a1 s1 d1 a2 s2 d2) /=# 0#
41 instance Ord Integer where
42 (J# a1 s1 d1) <= (J# a2 s2 d2)
43 = (cmpInteger# a1 s1 d1 a2 s2 d2) <=# 0#
45 (J# a1 s1 d1) < (J# a2 s2 d2)
46 = (cmpInteger# a1 s1 d1 a2 s2 d2) <# 0#
48 (J# a1 s1 d1) >= (J# a2 s2 d2)
49 = (cmpInteger# a1 s1 d1 a2 s2 d2) >=# 0#
51 (J# a1 s1 d1) > (J# a2 s2 d2)
52 = (cmpInteger# a1 s1 d1 a2 s2 d2) ># 0#
54 x@(J# a1 s1 d1) `max` y@(J# a2 s2 d2)
55 = if ((cmpInteger# a1 s1 d1 a2 s2 d2) ># 0#) then x else y
57 x@(J# a1 s1 d1) `min` y@(J# a2 s2 d2)
58 = if ((cmpInteger# a1 s1 d1 a2 s2 d2) <# 0#) then x else y
60 _tagCmp (J# a1 s1 d1) (J# a2 s2 d2)
61 = case cmpInteger# a1 s1 d1 a2 s2 d2 of { res# ->
62 if res# <# 0# then _LT else
63 if res# ># 0# then _GT else _EQ
66 instance Num Integer where
67 (+) (J# a1 s1 d1) (J# a2 s2 d2)
68 = plusInteger# a1 s1 d1 a2 s2 d2
70 (-) (J# a1 s1 d1) (J# a2 s2 d2)
71 = minusInteger# a1 s1 d1 a2 s2 d2
73 negate (J# a s d) = negateInteger# a s d
75 (*) (J# a1 s1 d1) (J# a2 s2 d2)
76 = timesInteger# a1 s1 d1 a2 s2 d2
78 -- ORIG: abs n = if n >= 0 then n else -n
81 = case _integer_0 of { J# a2 s2 d2 ->
82 if (cmpInteger# a1 s1 d1 a2 s2 d2) >=# 0#
84 else negateInteger# a1 s1 d1
93 signum n@(J# a1 s1 d1)
94 = case _integer_0 of { J# a2 s2 d2 ->
96 cmp = cmpInteger# a1 s1 d1 a2 s2 d2
98 if cmp ># 0# then _integer_1
99 else if cmp ==# 0# then _integer_0
105 fromInt (I# n#) = int2Integer# n# -- gives back a full-blown Integer
107 instance Real Integer where
110 instance Integral Integer where
111 quotRem (J# a1 s1 d1) (J# a2 s2 d2)
112 = case (quotRemInteger# a1 s1 d1 a2 s2 d2) of
113 _Return2GMPs a3 s3 d3 a4 s4 d4
114 -> (J# a3 s3 d3, J# a4 s4 d4)
116 {- USING THE UNDERLYING "GMP" CODE IS DUBIOUS FOR NOW:
118 divMod (J# a1 s1 d1) (J# a2 s2 d2)
119 = case (divModInteger# a1 s1 d1 a2 s2 d2) of
120 _Return2GMPs a3 s3 d3 a4 s4 d4
121 -> (J# a3 s3 d3, J# a4 s4 d4)
124 toInt (J# a s d) = case (integer2Int# a s d) of { n# -> I# n# }
126 -- the rest are identical to the report default methods;
127 -- you get slightly better code if you let the compiler
128 -- see them right here:
129 n `quot` d = q where (q,r) = quotRem n d
130 n `rem` d = r where (q,r) = quotRem n d
131 n `div` d = q where (q,r) = divMod n d
132 n `mod` d = r where (q,r) = divMod n d
134 divMod n d = case (quotRem n d) of { qr@(q,r) ->
135 if signum r == - signum d then (q-1, r+d) else qr }
136 -- Case-ified by WDP 94/10
138 even x = (==) (rem x 2) 0
139 odd x = (/=) (rem x 2) 0
141 instance Ix Integer where
144 | inRange b i = fromInteger (i - m)
145 | otherwise = error ("Ix.Integer.index{PreludeCore}: Index "
146 ++ show i ++ " outside the range "
148 inRange (m,n) i = m <= i && i <= n
150 instance Enum Integer where
151 {- RAW PRELUDE ************************
152 enumFrom = numericEnumFrom
153 enumFromThen = numericEnumFromThen
155 enumFrom n = n : enumFrom (n + 1)
156 enumFromThen m n = en' m (n - m)
157 where en' m n = m : en' (m + n) n
160 instance Text Integer where
161 readsPrec p x = readSigned readDec x
162 showsPrec x = showSigned showInt x