license and formatting
authorDon Stewart <dons@cse.unsw.edu.au>
Wed, 10 Jan 2007 15:43:41 +0000 (16:43 +0100)
committerDon Stewart <dons@cse.unsw.edu.au>
Wed, 10 Jan 2007 15:43:41 +0000 (16:43 +0100)
src/Data/ByteString/Binary.hs
src/Data/ByteString/Binary/DecM.hs

index 60b9e02..a7b30a9 100644 (file)
@@ -1,9 +1,97 @@
-module Data.ByteString.Binary
-    ( module Data.ByteString.Binary.EncM
+-----------------------------------------------------------------------------
+-- |
+-- Module      :
+-- Copyright   :  (c)
+-- License     :  BSD3-style (see LICENSE)
+-- 
+-- Maintainer  :
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Data.ByteString.Binary (
+      module Data.ByteString.Binary.EncM
     , module Data.ByteString.Binary.DecM
-    , module Data.ByteString.Binary.Class
-    ) where
+  ) where
 
 import Data.ByteString.Binary.EncM
 import Data.ByteString.Binary.DecM
-import Data.ByteString.Binary.Class
+
+import Control.Monad
+import Foreign
+
+class Binary t where
+    put :: t -> EncM ()
+    get :: DecM t
+
+instance Binary () where
+    put () = return ()
+    get    = return ()
+
+instance Binary Bool where
+    put = putWord8 . fromIntegral . fromEnum
+    get = liftM (toEnum . fromIntegral) getWord8
+
+instance Binary Word8 where
+    put = putWord8
+    get = getWord8
+
+instance Binary Word16 where
+    put = putWord16be
+    get = getWord16be
+
+instance Binary Word32 where
+    put = putWord32be
+    get = getWord32be
+
+instance Binary Word64 where
+    put = putWord64be
+    get = getWord64be
+
+instance Binary Int8 where
+    put i = put (fromIntegral i :: Word8)
+    get = get >>= \(w::Word8) -> return $! fromIntegral w
+
+instance Binary Int16 where
+    put i = put (fromIntegral i :: Word16)
+    get = get >>= \(w::Word16) -> return $! fromIntegral w
+
+instance Binary Int32 where
+    put i = put (fromIntegral i :: Word32)
+    get = get >>= \(w::Word32) -> return $! fromIntegral w
+
+instance Binary Int64 where
+    put i = put (fromIntegral i :: Word64)
+    get = get >>= \(w::Word64) -> return $! fromIntegral w
+
+instance Binary Int where
+    put i = put (fromIntegral i :: Int32)
+    get = get >>= \(i::Int32) -> return $! fromIntegral i
+
+instance Binary a => Binary [a] where
+    put [] = putWord8 0
+    put (x:xs) = putWord8 1 >> put x >> put xs
+    get = do
+        w <- getWord8
+        case w of
+            0 -> return []
+            _ -> liftM2 (:) get get
+
+instance Binary a => Binary (Maybe a) where
+    put Nothing = putWord8 0
+    put (Just x) = putWord8 1 >> put x
+    get = do
+        w <- getWord8
+        case w of
+            0 -> return Nothing
+            _ -> liftM Just get
+
+instance (Binary a, Binary b) => Binary (Either a b) where
+    put (Left  a) = putWord8 0 >> put a
+    put (Right b) = putWord8 1 >> put b
+    get = do
+        w <- getWord8
+        case w of
+            0 -> liftM Left  get
+            _ -> liftM Right get
index 10ada35..3372fb8 100644 (file)
@@ -1,4 +1,16 @@
-module Data.ByteString.Binary.DecM 
+-----------------------------------------------------------------------------
+-- |
+-- Module      :
+-- Copyright   : 
+-- License     :  BSD3-style (see LICENSE)
+-- 
+-- Maintainer  :
+-- Stability   :  stable
+-- Portability :  portable
+--
+-----------------------------------------------------------------------------
+
+module Data.ByteString.Binary.DecM
     ( DecM
     , runDecM
     , getWord8
@@ -52,11 +64,11 @@ ensureLeft :: Int64 -> DecM ()
 ensureLeft n = do
     (B.LPS strs) <- get
     worker n strs
-    where
+  where
     worker :: Int64 -> [B.ByteString] -> DecM ()
     worker n _ | n <= 0 = return ()
-    worker _ [] = fail "not enough bytestring left"
-    worker n (x:xs) = worker (n - fromIntegral (B.length x)) xs
+    worker _ []         = fail "not enough bytestring left"
+    worker n (x:xs)     = worker (n - fromIntegral (B.length x)) xs
 
 takeN :: Int64 -> DecM B.ByteString
 takeN n = readN n (\s -> let (B.LPS ls) = L.take n s in B.concat ls)
@@ -77,7 +89,7 @@ getWord16be :: DecM Word16
 getWord16be = do
     w1 <- liftM fromIntegral getWord8
     w2 <- liftM fromIntegral getWord8
-    return $! w1 `unsafeShiftL_Word16` 8 .|. w2 
+    return $! w1 `unsafeShiftL_Word16` 8 .|. w2
 
 {-# INLINE getWord16le #-}
 getWord16le :: DecM Word16
@@ -93,21 +105,21 @@ getWord32be :: DecM Word32
 getWord32be = do
     w1 <- liftM fromIntegral getWord16be
     w2 <- liftM fromIntegral getWord16be
-    return $! w1 `shiftL` 16 .|. w2 
+    return $! w1 `shiftL` 16 .|. w2
 
 {-# INLINE getWord32le #-}
 getWord32le :: DecM Word32
 getWord32le = do
     w1 <- liftM fromIntegral getWord16le
     w2 <- liftM fromIntegral getWord16le
-    return $! w2 `shiftL` 16 .|. w1 
+    return $! w2 `shiftL` 16 .|. w1
 
 {-# INLINE getWord64be #-}
 getWord64be :: DecM Word64
 getWord64be = do
     w1 <- liftM fromIntegral getWord32be
     w2 <- liftM fromIntegral getWord32be
-    return $! w1 `shiftL` 32 .|. w2 
+    return $! w1 `shiftL` 32 .|. w2
 
 {-# INLINE getWord64le #-}
 getWord64le :: DecM Word64
@@ -118,4 +130,7 @@ getWord64le = do
 
 {-# *IGNORE* RULES "readN/combine" forall s1 s2 f1 f2 k.  readN s1 f1 >>= \w1 -> readN s2 f2 >>= \w2 -> k = readN (s1+s2) (\s -> f1 s >>= \w1 -> f2 (L.drop s1 s)) #-}
 
-{-# RULES "ensureLeft/combine" forall a b. ensureLeft a >> ensureLeft b = ensureLeft (max a b) #-}
+{-# RULES
+ "ensureLeft/combine" forall a b.
+        ensureLeft a >> ensureLeft b = ensureLeft (max a b)
+#-}