msgpack 0.2.0 → 0.2.2
raw patch · 6 files changed
+41/−30 lines, 6 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.MessagePack.Class: instance [incoherent] OBJECT ()
Files
- msgpack.cabal +1/−1
- src/Data/MessagePack/Base.hsc +15/−12
- src/Data/MessagePack/Class.hs +5/−1
- src/Data/MessagePack/Feed.hs +8/−5
- src/Data/MessagePack/Monad.hs +12/−9
- src/Data/MessagePack/Stream.hs +0/−2
msgpack.cabal view
@@ -1,5 +1,5 @@ Name: msgpack-Version: 0.2.0+Version: 0.2.2 License: BSD3 License-File: LICENSE Author: Hideyuki Tanaka
src/Data/MessagePack/Base.hsc view
@@ -297,7 +297,7 @@ -- | Pack a single byte stream. It calls 'packRAW' and 'packRAWBody'. packRAW' :: Packer -> ByteString -> IO Int packRAW' pc bs = do- packRAW pc (BS.length bs)+ _ <- packRAW pc (BS.length bs) packRAWBody pc bs type Unpacker = ForeignPtr ()@@ -475,7 +475,7 @@ (#const MSGPACK_OBJECT_MAP) -> peekObjectMap ptr _ ->- fail "peekObject: unknown object type"+ fail $ "peekObject: unknown object type (" ++ show typ ++ ")" peekObjectBool :: Ptr a -> IO Object peekObjectBool ptr = do@@ -506,20 +506,22 @@ peekObjectArray :: Ptr a -> IO Object peekObjectArray ptr = do- size <- (#peek msgpack_object, via.array.size) ptr- p <- (#peek msgpack_object, via.array.ptr) ptr- objs <- mapM (\i -> peekObject $ p `plusPtr`+ csize <- (#peek msgpack_object, via.array.size) ptr+ let size = fromIntegral (csize :: Word32)+ p <- (#peek msgpack_object, via.array.ptr) ptr+ objs <- mapM (\i -> peekObject $ p `plusPtr` ((#size msgpack_object) * i))- [0..size-1]+ [0..size-1] return $ ObjectArray objs peekObjectMap :: Ptr a -> IO Object peekObjectMap ptr = do- size <- (#peek msgpack_object, via.map.size) ptr- p <- (#peek msgpack_object, via.map.ptr) ptr- dat <- mapM (\i -> peekObjectKV $ p `plusPtr`+ csize <- (#peek msgpack_object, via.map.size) ptr+ let size = fromIntegral (csize :: Word32)+ p <- (#peek msgpack_object, via.map.ptr) ptr+ dat <- mapM (\i -> peekObjectKV $ p `plusPtr` ((#size msgpack_object_kv) * i))- [0..size-1]+ [0..size-1] return $ ObjectMap dat peekObjectKV :: Ptr a -> IO (Object, Object)@@ -541,11 +543,11 @@ packObject pc (ObjectRAW bs) = packRAW' pc bs >> return () packObject pc (ObjectArray ls) = do- packArray pc (length ls)+ _ <- packArray pc (length ls) mapM_ (packObject pc) ls packObject pc (ObjectMap ls) = do- packMap pc (length ls)+ _ <- packMap pc (length ls) mapM_ (\(a, b) -> packObject pc a >> packObject pc b) ls data UnpackReturn =@@ -560,6 +562,7 @@ allocaBytes (#size msgpack_object) $ \ptr -> BS.useAsCStringLen dat $ \(str, len) -> alloca $ \poff -> do+ poke poff 0 ret <- msgpack_unpack str (fromIntegral len) poff z ptr case ret of (#const MSGPACK_UNPACK_SUCCESS) -> do
src/Data/MessagePack/Class.hs view
@@ -27,7 +27,6 @@ import Control.Monad.Error import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as C8-import Data.Either import Data.MessagePack.Base @@ -45,6 +44,11 @@ fromObjectError :: String fromObjectError = "fromObject: cannot cast"++instance OBJECT () where+ toObject = const ObjectNil+ fromObject ObjectNil = Right ()+ fromObject _ = Left fromObjectError instance OBJECT Int where toObject = ObjectInteger
src/Data/MessagePack/Feed.hs view
@@ -21,7 +21,6 @@ feederFromString, ) where -import Control.Monad import Data.ByteString (ByteString) import qualified Data.ByteString as BS import Data.IORef@@ -33,12 +32,16 @@ -- | Feeder from Handle feederFromHandle :: Handle -> IO Feeder feederFromHandle h = return $ do- bs <- BS.hGet h bufSize+ bs <- BS.hGetNonBlocking h bufSize if BS.length bs > 0- then return $ Just bs+ then do return $ Just bs else do- hClose h- return Nothing+ c <- BS.hGet h 1+ if BS.length c > 0+ then do return $ Just c+ else do+ hClose h+ return Nothing where bufSize = 4096
src/Data/MessagePack/Monad.hs view
@@ -79,10 +79,10 @@ packToString m = do sb <- liftIO $ newSimpleBuffer pc <- liftIO $ newPacker sb- runPackerT m pc+ _ <- runPackerT m pc liftIO $ simpleBufferData sb --- | Execcute given serializer and write byte sequence to Handle.+-- | Execute given serializer and write byte sequence to Handle. packToHandle :: MonadIO m => Handle -> PackerT m r -> m () packToHandle h m = do sb <- packToString m@@ -115,18 +115,21 @@ instance MonadIO m => MonadUnpacker (UnpackerT m) where get = UnpackerT $ \up feed -> liftIO $ do- resp <- unpackerExecute up- guard $ resp>=0- when (resp==0) $ do- Just bs <- feed- unpackerFeed up bs- resp2 <- unpackerExecute up- guard $ resp2==1+ executeOne up feed obj <- unpackerData up freeZone =<< unpackerReleaseZone up unpackerReset up let Right r = fromObject obj return r+ + where+ executeOne up feed = do+ resp <- unpackerExecute up+ guard $ resp>=0+ when (resp==0) $ do+ Just bs <- feed+ unpackerFeed up bs+ executeOne up feed -- | Execute deserializer using given feeder. unpackFrom :: MonadIO m => Feeder -> UnpackerT m r -> m r
src/Data/MessagePack/Stream.hs view
@@ -19,9 +19,7 @@ unpackObjectsFromString, ) where -import Control.Monad import Data.ByteString (ByteString)-import qualified Data.ByteString as BS import System.IO import System.IO.Unsafe