OddWord 1.0.0 → 1.0.0.1
raw patch · 4 files changed
+44/−22 lines, 4 filesdep ~QuickCheckdep ~basePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: QuickCheck, base
API changes (from Hackage documentation)
- Data.Word.Odd: instance (Bits a, TypeNum n) => Bits (OddWord a n)
- Data.Word.Odd: instance Read a => Read (OddWord a n)
+ Data.Word.Odd: instance (Num a, Bits a, TypeNum n) => Bits (OddWord a n)
+ Data.Word.Odd: instance (Read a, Num a, Bits a, TypeNum n) => Read (OddWord a n)
Files
- NEWS +10/−0
- OddWord.cabal +10/−6
- src/Data/Word/Odd.hs +16/−12
- test/Main.hs +8/−4
+ NEWS view
@@ -0,0 +1,10 @@+OddWord - Release History++release-1.0.0.1 - 2012.12.30++ * Fixed compilation with base-4.6 (GHC 7.6).+ * Fixed bug in Read instance and extended test suite.++release-1.0.0 - 2011.07.21++ * Initial release.
OddWord.cabal view
@@ -1,8 +1,8 @@ name: OddWord-version: 1.0.0+version: 1.0.0.1 license: BSD3 license-file: LICENSE-copyright: (c) 2011 Robin KAY+copyright: (c) 2011-2012 Robin KAY author: Robin KAY maintainer: Robin KAY <komadori@gekkou.co.uk> synopsis: Provides a wrapper for deriving word types with fewer bits.@@ -10,7 +10,7 @@ stability: Stable cabal-version: >= 1.10 build-type: Simple-extra-source-files: test/*.hs+extra-source-files: test/*.hs NEWS homepage: http://www.gekkou.co.uk/ description: Provdes the 'OddWord' type, which wraps an existing integer type and@@ -23,7 +23,7 @@ default-language: Haskell2010 other-extensions: ScopedTypeVariables build-depends:- base >= 4 && < 5+ base >= 4.5 && < 5 Test-Suite oddword-tests type: exitcode-stdio-1.0@@ -32,6 +32,10 @@ default-language: Haskell2010 other-extensions: ScopedTypeVariables build-depends:- base >= 4 && < 5,- QuickCheck >= 2.4 && < 2.5,+ base >= 4.5 && < 5,+ QuickCheck >= 2.4 && < 2.6, OddWord >= 1.0 && < 1.1++Source-repository head+ type: darcs+ location: https://patch-tag.com/r/komadori/OddWord
src/Data/Word/Odd.hs view
@@ -62,9 +62,12 @@ pairOW :: (a, a) -> (OddWord a n, OddWord a n) pairOW = uncurry ((,) `on` OW) -owMask :: forall a n. (Bits a, TypeNum n) => OddWord a n+owMask :: forall a n. (Num a, Bits a, TypeNum n) => OddWord a n owMask = OW $ (flip (-) 1) $ bit $ fromTypeNum (typeNum :: TypeNumBuilder n) +maskOW :: forall a n. (Num a, Bits a, TypeNum n) => a -> OddWord a n+maskOW w = OW $ w .&. unOW (owMask :: OddWord a n)+ mapFst :: (a -> b) -> [(a, c)] -> [(b, c)] mapFst f xs = map (\(a,c) -> (f a,c)) xs @@ -73,19 +76,19 @@ show (OW x) = show x showList xs = showList $ map unOW xs -instance (Read a) => Read (OddWord a n) where- readsPrec p s = mapFst OW $ readsPrec p s- readList s = mapFst (map OW) $ readList s+instance (Read a, Num a, Bits a, TypeNum n) => Read (OddWord a n) where+ readsPrec p s = mapFst maskOW $ readsPrec p s+ readList s = mapFst (map maskOW) $ readList s instance (Num a, Bits a, TypeNum n) => Num (OddWord a n) where- (OW l) + (OW r) = OW $ (l + r) .&. unOW (owMask :: OddWord a n)- (OW l) * (OW r) = OW $ (l * r) .&. unOW (owMask :: OddWord a n)- (OW l) - (OW r) = OW $ (l - r) .&. unOW (owMask :: OddWord a n)- negate (OW x) = OW $ negate x .&. unOW (owMask :: OddWord a n)+ (OW l) + (OW r) = maskOW $ (l + r)+ (OW l) * (OW r) = maskOW $ (l * r)+ (OW l) - (OW r) = maskOW $ (l - r)+ negate (OW x) = maskOW $ negate x abs w = w signum (OW x) | x == 0 = 0 | otherwise = 1- fromInteger i = OW $ fromInteger i .&. unOW (owMask :: OddWord a n) + fromInteger i = maskOW $ fromInteger i instance (Real a, Bits a, TypeNum n) => Real (OddWord a n) where toRational (OW x) = toRational x@@ -117,11 +120,11 @@ divMod (OW n) (OW d) = pairOW $ divMod n d toInteger (OW x) = toInteger x -instance (Bits a, TypeNum n) => Bits (OddWord a n) where+instance (Num a, Bits a, TypeNum n) => Bits (OddWord a n) where (OW l) .&. (OW r) = OW $ l .&. r (OW l) .|. (OW r) = OW $ l .|. r xor (OW l) (OW r) = OW $ xor l r- complement (OW x) = OW $ complement x .&. unOW (owMask :: OddWord a n)+ complement (OW x) = maskOW $ complement x bit n | n < fromTypeNum (typeNum :: TypeNumBuilder n) = OW $ bit n | otherwise = OW 0@@ -135,7 +138,7 @@ testBit (OW x) n = testBit x n bitSize _ = fromTypeNum (typeNum :: TypeNumBuilder n) isSigned _ = False - shiftL (OW x) n = OW $ shiftL x n .&. unOW (owMask :: OddWord a n)+ shiftL (OW x) n = maskOW $ shiftL x n shiftR (OW x) n = OW $ shiftR x n rotateL (OW x) n = OW $ (shiftL x n' .&. unOW (owMask :: OddWord a n)) .|. shiftR x (w-n')@@ -145,6 +148,7 @@ shiftR x n' .|. (shiftL x (w-n') .&. unOW (owMask :: OddWord a n)) where n' = n `mod` w w = fromTypeNum (typeNum :: TypeNumBuilder n)+ popCount (OW x) = popCount x type Word1 = OddWord Word8 (One ()) type Word2 = OddWord Word8 (One (Zero ()))
test/Main.hs view
@@ -14,10 +14,10 @@ Add Integer | Mul Integer | Sub Integer | SubR Integer | Div Integer | Mod Integer | Quot Integer | Rem Integer | DivR Integer | ModR Integer | QuotR Integer | RemR Integer |- Neg | Abs | Inv |+ Neg | Abs | Inv | AddDigit | And Integer | Or Integer | Xor Integer | ClrB Int | SetB Int | InvB Int |- Shift Int | Rot Int+ Shift Int | Rot Int | PopCnt deriving Show instance Arbitrary (UFunc) where@@ -37,6 +37,7 @@ return Neg, return Abs, return Inv,+ return AddDigit, choose (0, 0xffff) >>= return . And, choose (0, 0xffff) >>= return . Or, choose (0, 0xffff) >>= return . Xor,@@ -44,7 +45,8 @@ choose (0, 32) >>= return . SetB, choose (0, 32) >>= return . InvB, choose (-32, 32) >>= return . Shift,- choose (-32, 32) >>= return . Rot]+ choose (-32, 32) >>= return . Rot,+ return PopCnt] safeDiv :: (Integral a, Bounded a) => a -> a -> a safeDiv d 0 = maxBound@@ -62,7 +64,7 @@ safeRem d 0 = 0 safeRem d n = rem d n -fromUFunc :: (Integral a, Bounded a, Bits a) => UFunc -> a -> a+fromUFunc :: (Integral a, Bounded a, Bits a, Read a, Show a) => UFunc -> a -> a fromUFunc (Add i) x = x + (fromInteger i) fromUFunc (Mul i) x = x * (fromInteger i) fromUFunc (Sub i) x = x - (fromInteger i)@@ -78,6 +80,7 @@ fromUFunc Neg x = negate x fromUFunc Abs x = abs x fromUFunc Inv x = complement x+fromUFunc AddDigit x = read . ('1':) $ show x fromUFunc (And i) x = x .&. (fromInteger i) fromUFunc (Or i) x = x .|. (fromInteger i) fromUFunc (Xor i) x = xor x (fromInteger i)@@ -86,6 +89,7 @@ fromUFunc (InvB n) x = complementBit x n fromUFunc (Shift n) x = shift x n fromUFunc (Rot n) x = rotate x n+fromUFunc PopCnt x = fromIntegral $ popCount x type TestWord16 = OddWord Word32 (One (Zero (Zero (Zero (Zero ())))))