module GHC.Integer.GMP.TypeExt
( popCountInteger
, testBitInteger
, setBitInteger
, clearBitInteger
) where
import Data.Bits (popCount, testBit, clearBit)
import GHC.Base (Int(..))
import GHC.Integer.GMP.Internals (Integer(..))
import GHC.Integer.GMP.Prim (int2Integer#)
import GHC.Prim (Int#, (/=#))
import GHC.Integer.GMP.PrimExt (popCountInteger#, testBitInteger#,
setBitInteger#, clearBitInteger#)
popCountInteger :: Integer -> Int#
popCountInteger (S# i) = let !(I# n) = popCount (I# i) in n
popCountInteger (J# s d) = popCountInteger# s d
testBitInteger :: Integer -> Int# -> Bool
testBitInteger (S# j) i = testBit (I# j) (I# i)
testBitInteger (J# s d) i = testBitInteger# s d i /=# 0#
setBitInteger :: Integer -> Int# -> Integer
setBitInteger (S# j) i =
let !(# s, d #) = int2Integer# j in setBitInteger (J# s d) i
setBitInteger (J# s d) i =
let !(# s', d' #) = setBitInteger# s d i in J# s' d'
clearBitInteger :: Integer -> Int# -> Integer
clearBitInteger (S# j) i = let !(I# j') = clearBit (I# j) (I# i) in S# j'
clearBitInteger (J# s d) i =
let !(# s', d' #) = clearBitInteger# s d i in J# s' d'