PreludeBuiltin

module PreludeBuiltin where
import qualified Builtin

primIntZero = Builtin.ord '\0'
primDoubleZero = Builtin.intToFloat primIntZero

--foreign import primIntToChar   :: Int -> Char
primIntToChar x = Builtin.chr x
--foreign import primCharToInt   :: Char -> Int
primCharToInt x = Builtin.ord x
--foreign import primUnicodeMaxChar :: Char -- = '\xffff'
primUnicodeMaxChar = '\1114111'

--foreign import primIntEq       :: Int -> Int -> Bool
primIntEq x y = Builtin.eqInt x y
--foreign import primIntLte      :: Int -> Int -> Bool
primIntLte x y = Builtin.lteInt x y

--foreign import primIntAdd      :: Int -> Int -> Int
primIntAdd x y = (Builtin.+) x y
--foreign import primIntSub      :: Int -> Int -> Int
primIntSub x y = (Builtin.-) x y
--foreign import primIntMul      :: Int -> Int -> Int
primIntMul x y = (Builtin.*) x y
--foreign import primIntQuot     :: Int -> Int -> Int
primIntQuot x y = (Builtin.quot) x y
--foreign import primIntRem      :: Int -> Int -> Int
primIntRem x y = (Builtin.rem) x y
--foreign import primIntNegate   :: Int -> Int
primIntNegate x = Builtin.negate x
--foreign import primIntAbs      :: Int -> Int
primIntAbs x = if primIntLte primIntZero x then x else primIntNegate x
--foreign import primIntSignum   :: Int -> Int
primIntSignum = Builtin.signumInt
--foreign import primIntMinBound :: Int
--foreign import primIntMaxBound :: Int
primIntMinBound = Builtin.minInt
primIntMaxBound = Builtin.maxInt
primIntBitSize  = Builtin.bitSizeInt

--foreign import primError       :: String -> a
primError = Builtin.error

--foreign import primSeq         :: a -> b -> b
--primSeq x y = y -- !!!
primSeq = Builtin.seq

primIntQuotRem x y = (x `primIntQuot` y,x `primIntRem` y)

primCharEq c c' = Builtin.eqChar c c'
primCharLte c c' = Builtin.lteChar c c'

--foreign import primInteger2Int     :: Integer -> Int
--primInteger2Int x = x -- !!!
--foreign import primInt2Integer     :: Int -> Integer
--primInt2Integer x = x -- !!!
{-
foreign import primIntegerLte      :: Integer -> Integer -> Bool
foreign import primIntegerEq       :: Integer -> Integer -> Bool

foreign import primIntegerAdd      :: Integer -> Integer -> Integer
foreign import primIntegerSub      :: Integer -> Integer -> Integer
foreign import primIntegerMul      :: Integer -> Integer -> Integer
foreign import primIntegerNegate   :: Integer -> Integer
foreign import primIntegerAbs      :: Integer -> Integer
foreign import primIntegerSignum   :: Integer -> Integer
foreign import primIntegerQuot     :: Integer -> Integer -> Integer
foreign import primIntegerRem      :: Integer -> Integer -> Integer

foreign import primFloatLte      :: Float -> Float -> Bool
foreign import primFloatEq       :: Float -> Float -> Bool

foreign import primFloatAdd      :: Float -> Float -> Float
foreign import primFloatSub      :: Float -> Float -> Float
foreign import primFloatMul      :: Float -> Float -> Float
foreign import primFloatNegate   :: Float -> Float
foreign import primFloatAbs      :: Float -> Float
foreign import primFloatSignum   :: Float -> Float
foreign import primFloatFromInteger :: Integer -> Float
-}
primDoubleLte = Builtin.lteFloat
primDoubleEq  = Builtin.eqFloat

primDoubleAdd = Builtin.plusFloat
primDoubleSub = Builtin.minusFloat
primDoubleMul = Builtin.mulFloat
primDoubleDiv = Builtin.divFloat
primDoubleNegate = Builtin.negateFloat
primDoubleTrunc = Builtin.truncFloat
primDoubleRound = Builtin.roundFloat
primDoubleFloor = Builtin.floorFloat
primDoubleCeil  = Builtin.ceilFloat
primDoubleAbs x = if primDoubleLte x 0 then primDoubleNegate x else x
primDoubleSignum = Builtin.signumFloat
primDoubleBitSize = Builtin.bitSizeFloat
primDoubleFromInt = Builtin.intToFloat
--primDoubleFromInteger = Builtin.intToFloat . fromInteger -- !!
primIntegralFromDouble x = fromIntegral (Builtin.floatToInt x) -- !!
primDoubleShow = Builtin.showFloat
--foreign import primDoubleEncodeFloat :: Integer -> Int -> Double
primDoubleExp = Builtin.expFloat
primDoubleExp2 = Builtin.exp2Float
primDoubleLog = Builtin.logFloat
primDoubleLog2 = Builtin.log2Float
primDoubleSin = Builtin.sinFloat
primDoubleCos = Builtin.cosFloat
primDoubleTan = Builtin.tanFloat