module Data.Integral
( fromIntegral'
, fromIntegral''
, INInt
, INLong
, inIntToInt
, intToINLong
, inIntToINLong
, intToINInt
) where
import Data.Int ( Int32, Int64 )
import Control.Exception ( assert )
type INInt = Int32
type INLong = Int64
inIntToInt :: INInt -> Int
inIntToInt = fromIntegral'
intToINLong :: Int -> INLong
intToINLong = fromIntegral'
inIntToINLong :: INInt -> INLong
inIntToINLong = fromIntegral'
intToINInt :: Int -> INInt
intToINInt = fromIntegral'
fromIntegral' :: (Bounded a, Integral a, Bounded b, Integral b) => a -> b
fromIntegral' x = let i = fromIntegral x
in assert ((toInteger (maxBound `asTypeOf` i)
>= toInteger (maxBound `asTypeOf` x))
&& (toInteger (minBound `asTypeOf` i)
<= toInteger (minBound `asTypeOf` x)))
i
fromIntegral'' :: (Integral a, Bounded b, Integral b) => a -> b
fromIntegral'' x = let i = fromIntegral x
in assert ((toInteger (maxBound `asTypeOf` i)
>= toInteger x)
&& (toInteger (minBound `asTypeOf` i)
<= toInteger x))
i