#include "MachDeps.h"
module GHC.Integer (
- Integer,
+ Integer, mkInteger,
smallInteger, wordToInteger, integerToWord, integerToInt,
#if WORD_SIZE_IN_BITS < 64
integerToWord64, word64ToInteger,
-- XXX Could move [] above us
data List a = Nil | Cons a (List a)
+mkInteger :: Bool -- non-negative?
+ -> [Int] -- absolute value in 31 bit chunks, least significant first
+ -- ideally these would be Words rather than Ints, but
+ -- we don't have Word available at the moment.
+ -> Integer
+mkInteger nonNegative is = let abs = f is
+ in if nonNegative then abs else negateInteger abs
+ where f [] = S# 0#
+ f (I# i : is') = S# i `orInteger` shiftLInteger (f is') 31#
+
errorInteger :: Integer
errorInteger = Positive errorPositive