Define testBitInteger; part of #3489. Patch from pumpkingod@gmail.com
authorIan Lynagh <ian@well-typed.com>
Sun, 5 Aug 2012 14:56:00 +0000 (15:56 +0100)
committerIan Lynagh <ian@well-typed.com>
Sun, 5 Aug 2012 14:56:00 +0000 (15:56 +0100)
libraries/integer-simple/GHC/Integer.hs
libraries/integer-simple/GHC/Integer/Type.hs

index 4122d38..3bc8f16 100644 (file)
@@ -33,7 +33,7 @@ module GHC.Integer (
     encodeDoubleInteger, decodeDoubleInteger, doubleFromInteger,
     -- gcdInteger, lcmInteger, -- XXX
     andInteger, orInteger, xorInteger, complementInteger,
-    shiftLInteger, shiftRInteger,
+    shiftLInteger, shiftRInteger, testInteger,
     hashInteger,
  ) where
 
index 67ed19c..ee2c08f 100644 (file)
@@ -314,6 +314,13 @@ shiftRInteger j@(Negative _) i
     = complementInteger (shiftRInteger (complementInteger j) i)
 shiftRInteger Naught         _ = Naught
 
+-- XXX this could be a lot more efficient, but this is a quick
+-- reimplementation of the default Data.Bits instance, so that we can
+-- implement the Integer interface
+testBitInteger :: Integer -> Int# -> Bool
+testBitInteger x i = (x `andInteger` (smallInteger 1# `shiftLInteger` i))
+        `neqInteger` smallInteger 0#
+
 twosComplementPositive :: Positive -> DigitsOnes
 twosComplementPositive p = flipBits (p `minusPositive` onePositive)