shithub: MicroHs

Download patch

ref: 633d3d10ac6dcdb283c831cd98b4aefe61d1ef4f
parent: acd1d15d178a2875f182f4449626d2e0419a5267
author: Lennart Augustsson <lennart@augustsson.net>
date: Thu Sep 12 13:42:15 EDT 2024

More Bits stuff

--- a/TODO
+++ b/TODO
@@ -38,3 +38,4 @@
 * Check for escaping skolemized variables
 * Type checking Data.Data
 * Class export with list does nt export $dflt
+* import M(method) doesn't work
--- a/lib/Data/Bits.hs
+++ b/lib/Data/Bits.hs
@@ -4,7 +4,7 @@
 import Control.Error
 import Data.Bool
 import Data.Eq
-import Data.Int()
+import Data.Int
 import Data.Maybe
 import Data.Ord
 import Data.Num
@@ -92,3 +92,18 @@
            | otherwise   = go (i + 1)
 
       w = finiteBitSize x
+
+instance Bits Int where
+  (.&.) = primIntAnd
+  (.|.) = primIntOr
+  xor   = primIntXor
+  complement = primIntInv
+  shiftL = primIntShl
+  shiftR = primIntShr
+  bitSizeMaybe _ = Just _wordSize
+  bitSize _ = _wordSize
+  bit n = primIntShl 1 n
+  zeroBits = 0
+
+instance FiniteBits Int where
+  finiteBitSize _ = _wordSize
--- a/lib/Data/Word.hs
+++ b/lib/Data/Word.hs
@@ -93,7 +93,11 @@
   bit n = primWordShl 1 n
   zeroBits = 0
 
---------------------------------------------------------------------------------
+
+instance FiniteBits Word where
+  finiteBitSize _ = _wordSize
+
+--------------------------------------------------------------------------------
 ----    Word8
 
 newtype Word8 = W8 Word
@@ -179,7 +183,10 @@
   bit n = w8 (primWordShl 1 n)
   zeroBits = 0
 
---------------------------------------------------------------------------------
+instance FiniteBits Word8 where
+  finiteBitSize _ = 8
+
+--------------------------------------------------------------------------------
 ----    Word16
 
 newtype Word16 = W16 Word
@@ -265,7 +272,10 @@
   bit n = w16 (primWordShl 1 n)
   zeroBits = 0
 
---------------------------------------------------------------------------------
+instance FiniteBits Word16 where
+  finiteBitSize _ = 16
+
+--------------------------------------------------------------------------------
 ----    Word32
 
 newtype Word32 = W32 Word
@@ -351,7 +361,10 @@
   bit n = w32 (primWordShl 1 n)
   zeroBits = 0
 
---------------------------------------------------------------------------------
+instance FiniteBits Word32 where
+  finiteBitSize _ = 32
+
+--------------------------------------------------------------------------------
 ----    Word64
 
 newtype Word64 = W64 Word
@@ -436,3 +449,6 @@
   bitSize _ = 64
   bit n = w64 (primWordShl 1 n)
   zeroBits = 0
+
+instance FiniteBits Word64 where
+  finiteBitSize _ = 64
--- a/lib/Primitives.hs
+++ b/lib/Primitives.hs
@@ -123,10 +123,19 @@
 primWordToFloatWRaw = primitive "toDbl"
 primWordFromFloatWRaw :: FloatW -> Word
 primWordFromFloatWRaw = primitive "toInt"
+
+primIntAnd :: Int -> Int -> Int
+primIntAnd  = primitive "and"
+primIntOr :: Int -> Int -> Int
+primIntOr  = primitive "or"
+primIntXor :: Int -> Int -> Int
+primIntXor  = primitive "xor"
 primIntShl :: Int -> Int -> Int
 primIntShl  = primitive "shl"
 primIntShr :: Int -> Int -> Int
 primIntShr  = primitive "ashr"
+primIntInv :: Int -> Int
+primIntInv  = primitive "inv"
 
 primWordEQ  :: Word -> Word -> Bool
 primWordEQ  = primitive "=="
--