summaryrefslogtreecommitdiff
path: root/haskell/src/Data/MessagePack.hs
blob: 2949e603d074e6981609cd4b5921844ef7babca0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
--------------------------------------------------------------------
-- |
-- Module    : Data.MessagePack
-- Copyright : (c) Hideyuki Tanaka, 2009
-- License   : BSD3
--
-- Maintainer:  tanaka.hideyuki@gmail.com
-- Stability :  experimental
-- Portability: portable
--
-- Simple interface to pack and unpack MessagePack data.
--
--------------------------------------------------------------------

module Data.MessagePack(
  module Data.MessagePack.Base,
  module Data.MessagePack.Class,
  module Data.MessagePack.Feed,
  module Data.MessagePack.Monad,
  module Data.MessagePack.Stream,
  
  -- * Pack and Unpack
  packb,
  unpackb,
  
  -- * Pure version of Pack and Unpack
  packb',
  unpackb',
  ) where

import Data.ByteString (ByteString)
import System.IO.Unsafe

import Data.MessagePack.Base
import Data.MessagePack.Class
import Data.MessagePack.Feed
import Data.MessagePack.Monad
import Data.MessagePack.Stream

-- | Pack Haskell data to MessagePack string.
packb :: OBJECT a => a -> IO ByteString
packb dat = do
  sb <- newSimpleBuffer
  pc <- newPacker sb
  pack pc dat
  simpleBufferData sb

-- | Unpack MessagePack string to Haskell data.
unpackb :: OBJECT a => ByteString -> IO (Result a)
unpackb bs = do
  withZone $ \z -> do
    r <- unpackObject z bs
    return $ case r of
      Left err -> Left (show err)
      Right (_, dat) -> fromObject dat

-- | Pure version of 'packb'.
packb' :: OBJECT a => a -> ByteString
packb' dat = unsafePerformIO $ packb dat

-- | Pure version of 'unpackb'.
unpackb' :: OBJECT a => ByteString -> Result a
unpackb' bs = unsafePerformIO $ unpackb bs