packages feed

MicroHs-0.11.4.0: hugs/Data/Integer.hs

-- Copyright 2023 Lennart Augustsson
-- See LICENSE file for full license.
module Data.Integer(
  _integerToIntList,
  _intListToInteger,
  ) where

-- For the combinator file we need a portable way to store
-- the Integer type.  We use [Int], with digits in a small base.
integerListBase :: Integer
integerListBase = 32768

-- These two functions return an (opaque) representation of an
-- Integer as [Int].
-- This is used by the compiler to generate Integer literals.
-- First _integerToIntList is used in the compiler to get a list of
-- Int, and the generated code will have a call to _intListToInteger.
_integerToIntList :: Integer -> [Int]
_integerToIntList i = if i < 0 then (-1::Int) : f (-i) else f i
  where f 0 = []
        f i = fromInteger r : f q  where (q, r) = quotRem i integerListBase

_intListToInteger :: [Int] -> Integer
_intListToInteger ads@(x : ds) = if x == -1 then - f ds else f ads
  where f = foldr (\ d a -> a * integerListBase + toInteger d) 0