Add `instance {Bits,FiniteBits} Bool`
authorHerbert Valerio Riedel <hvr@gnu.org>
Sun, 24 Nov 2013 12:14:16 +0000 (13:14 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Sun, 24 Nov 2013 12:19:19 +0000 (13:19 +0100)
This interprets `Bool` as an 1-bit "unsigned" bit-field and provides a
simple (not particularily optimized) implementation to that end.

See "Proposal: Add `instance Bits Bool`" by @ekmett, Nov 2013,

 http://permalink.gmane.org/gmane.comp.lang.haskell.libraries/20663

Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
Data/Bits.hs

index 2654a80..f43c8a5 100644 (file)
@@ -303,6 +303,41 @@ popCountDefault = go 0
    go c w = go (c+1) (w .&. (w - 1)) -- clear the least significant
 {-# INLINABLE popCountDefault #-}
 
+
+-- Interpret 'Bool' as 1-bit bit-field; /Since: 4.7.0.0/
+instance Bits Bool where
+    (.&.) = (&&)
+
+    (.|.) = (||)
+
+    xor = (/=)
+
+    complement = not
+
+    shift x 0 = x
+    shift _ _ = False
+
+    rotate x _ = x
+
+    bit 0 = True
+    bit _ = False
+
+    testBit x 0 = x
+    testBit _ _ = False
+
+    bitSizeMaybe _ = Just 1
+
+    bitSize _ = 1
+
+    isSigned _ = False
+
+    popCount False = 0
+    popCount True  = 1
+
+instance FiniteBits Bool where
+    finiteBitSize _ = 1
+
+
 instance Bits Int where
     {-# INLINE shift #-}
     {-# INLINE bit #-}