msgpack-python/haskell/src/Data/MessagePack.hs

127 lines
3.3 KiB
Haskell
Raw Normal View History

2010-04-18 02:17:49 +09:00
--------------------------------------------------------------------
-- |
-- Module : Data.MessagePack
2010-09-06 01:32:00 +09:00
-- Copyright : (c) Hideyuki Tanaka, 2009-2010
2010-04-18 02:17:49 +09:00
-- License : BSD3
--
-- Maintainer: tanaka.hideyuki@gmail.com
-- Stability : experimental
-- Portability: portable
--
-- Simple interface to pack and unpack MessagePack data.
--
--------------------------------------------------------------------
module Data.MessagePack(
2010-09-06 01:32:00 +09:00
module Data.MessagePack.Object,
module Data.MessagePack.Put,
module Data.MessagePack.Parser,
2010-09-06 17:00:22 +09:00
module Data.MessagePack.Iteratee,
2010-04-18 02:17:49 +09:00
2010-09-06 01:32:00 +09:00
-- * Simple functions of Pack and Unpack
pack,
unpack,
-- * Pack functions
packToString,
packToHandle,
2010-09-07 16:14:00 +09:00
packToHandle',
2010-09-06 01:32:00 +09:00
packToFile,
-- * Unpack functions
unpackFromString,
unpackFromHandle,
unpackFromFile,
2010-09-06 17:00:22 +09:00
unpackFromStringI,
unpackFromHandleI,
unpackFromFileI,
2010-04-18 02:17:49 +09:00
) where
2010-09-06 01:32:00 +09:00
import qualified Control.Monad.CatchIO as CIO
import Control.Monad.IO.Class
import qualified Data.Attoparsec as A
import Data.Binary.Put
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import Data.Functor.Identity
import qualified Data.Iteratee as I
import System.IO
import Data.MessagePack.Object
import Data.MessagePack.Put
import Data.MessagePack.Parser
2010-09-06 17:00:22 +09:00
import Data.MessagePack.Iteratee
2010-09-06 01:32:00 +09:00
bufferSize :: Int
bufferSize = 4 * 1024
2010-04-18 02:17:49 +09:00
2010-09-06 01:32:00 +09:00
class IsByteString s where
toBS :: s -> B.ByteString
instance IsByteString B.ByteString where
toBS = id
instance IsByteString L.ByteString where
toBS = B.concat . L.toChunks
2010-04-18 02:17:49 +09:00
-- | Pack Haskell data to MessagePack string.
2010-09-06 01:32:00 +09:00
pack :: ObjectPut a => a -> L.ByteString
pack = packToString . put
2010-04-18 02:17:49 +09:00
-- | Unpack MessagePack string to Haskell data.
2010-09-06 01:32:00 +09:00
unpack :: (ObjectGet a, IsByteString s) => s -> a
unpack bs =
2010-09-06 17:00:22 +09:00
runIdentity $ I.run $ I.joinIM $ I.enumPure1Chunk (toBS bs) getI
2010-09-06 01:32:00 +09:00
-- TODO: tryUnpack
-- | Pack to ByteString.
packToString :: Put -> L.ByteString
packToString = runPut
-- | Pack to Handle
packToHandle :: Handle -> Put -> IO ()
packToHandle h = L.hPutStr h . packToString
2010-09-07 16:14:00 +09:00
-- | Pack to Handle and Flush Handle
packToHandle' :: Handle -> Put -> IO ()
packToHandle' h p = packToHandle h p >> hFlush h
2010-09-06 01:32:00 +09:00
-- | Pack to File
packToFile :: FilePath -> Put -> IO ()
packToFile path = L.writeFile path . packToString
-- | Unpack from ByteString
unpackFromString :: (Monad m, IsByteString s) => s -> A.Parser a -> m a
unpackFromString bs =
2010-09-06 17:00:22 +09:00
unpackFromStringI bs . parserToIteratee
2010-09-06 01:32:00 +09:00
-- | Unpack from Handle
unpackFromHandle :: CIO.MonadCatchIO m => Handle -> A.Parser a -> m a
unpackFromHandle h =
2010-09-06 17:00:22 +09:00
unpackFromHandleI h .parserToIteratee
2010-09-06 01:32:00 +09:00
-- | Unpack from File
unpackFromFile :: CIO.MonadCatchIO m => FilePath -> A.Parser a -> m a
2010-09-06 17:00:22 +09:00
unpackFromFile path =
unpackFromFileI path . parserToIteratee
-- | Iteratee interface to unpack from ByteString
unpackFromStringI :: (Monad m, IsByteString s) => s -> I.Iteratee B.ByteString m a -> m a
unpackFromStringI bs =
I.run . I.joinIM . I.enumPure1Chunk (toBS bs)
-- | Iteratee interface to unpack from Handle
unpackFromHandleI :: CIO.MonadCatchIO m => Handle -> I.Iteratee B.ByteString m a -> m a
unpackFromHandleI h =
2010-09-06 23:27:50 +09:00
I.run . I.joinIM . enumHandleNonBlocking bufferSize h
2010-09-06 17:00:22 +09:00
-- | Iteratee interface to unpack from File
unpackFromFileI :: CIO.MonadCatchIO m => FilePath -> I.Iteratee B.ByteString m a -> m a
unpackFromFileI path p =
2010-09-06 01:32:00 +09:00
CIO.bracket
(liftIO $ openBinaryFile path ReadMode)
(liftIO . hClose)
2010-09-06 17:00:22 +09:00
(flip unpackFromHandleI p)