summaryrefslogtreecommitdiff
path: root/haskell/src/Data/MessagePack/Class.hs
diff options
context:
space:
mode:
authorHideyuki Tanaka <hideyuki@hideyuki-vbox.(none)>2010-04-18 02:17:49 +0900
committerHideyuki Tanaka <hideyuki@hideyuki-vbox.(none)>2010-04-18 02:17:49 +0900
commitf53c351fd28b3bea6a03416a54aff631499af65a (patch)
tree2c66380a8809ad9e8d2c47046cdedf2e988ec462 /haskell/src/Data/MessagePack/Class.hs
parentfb96617377ed7330edcf239d807d2ae378e336e9 (diff)
downloadmsgpack-python-f53c351fd28b3bea6a03416a54aff631499af65a.tar.gz
haskell binding
Diffstat (limited to 'haskell/src/Data/MessagePack/Class.hs')
-rw-r--r--haskell/src/Data/MessagePack/Class.hs97
1 files changed, 97 insertions, 0 deletions
diff --git a/haskell/src/Data/MessagePack/Class.hs b/haskell/src/Data/MessagePack/Class.hs
new file mode 100644
index 0000000..f50a4d8
--- /dev/null
+++ b/haskell/src/Data/MessagePack/Class.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE TypeSynonymInstances #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverlappingInstances #-}
+{-# LANGUAGE IncoherentInstances #-}
+
+--------------------------------------------------------------------
+-- |
+-- Module : Data.MessagePack.Class
+-- Copyright : (c) Hideyuki Tanaka, 2009
+-- License : BSD3
+--
+-- Maintainer: tanaka.hideyuki@gmail.com
+-- Stability : experimental
+-- Portability: portable
+--
+-- Serializing Haskell values to and from MessagePack Objects.
+--
+--------------------------------------------------------------------
+
+module Data.MessagePack.Class(
+ -- * Serialization to and from Object
+ OBJECT(..),
+ Result,
+ pack,
+ ) where
+
+import Control.Monad.Error
+import Data.ByteString.Char8 (ByteString)
+import qualified Data.ByteString.Char8 as C8
+import Data.Either
+
+import Data.MessagePack.Base
+
+-- | The class of types serializable to and from MessagePack object
+class OBJECT a where
+ toObject :: a -> Object
+ fromObject :: Object -> Result a
+
+-- | A type for parser results
+type Result a = Either String a
+
+instance OBJECT Object where
+ toObject = id
+ fromObject = Right
+
+fromObjectError :: String
+fromObjectError = "fromObject: cannot cast"
+
+instance OBJECT Int where
+ toObject = ObjectInteger
+ fromObject (ObjectInteger n) = Right n
+ fromObject _ = Left fromObjectError
+
+instance OBJECT Bool where
+ toObject = ObjectBool
+ fromObject (ObjectBool b) = Right b
+ fromObject _ = Left fromObjectError
+
+instance OBJECT Double where
+ toObject = ObjectDouble
+ fromObject (ObjectDouble d) = Right d
+ fromObject _ = Left fromObjectError
+
+instance OBJECT ByteString where
+ toObject = ObjectRAW
+ fromObject (ObjectRAW bs) = Right bs
+ fromObject _ = Left fromObjectError
+
+instance OBJECT String where
+ toObject = toObject . C8.pack
+ fromObject obj = liftM C8.unpack $ fromObject obj
+
+instance OBJECT a => OBJECT [a] where
+ toObject = ObjectArray . map toObject
+ fromObject (ObjectArray arr) =
+ mapM fromObject arr
+ fromObject _ =
+ Left fromObjectError
+
+instance (OBJECT a, OBJECT b) => OBJECT [(a, b)] where
+ toObject =
+ ObjectMap . map (\(a, b) -> (toObject a, toObject b))
+ fromObject (ObjectMap mem) = do
+ mapM (\(a, b) -> liftM2 (,) (fromObject a) (fromObject b)) mem
+ fromObject _ =
+ Left fromObjectError
+
+instance OBJECT a => OBJECT (Maybe a) where
+ toObject (Just a) = toObject a
+ toObject Nothing = ObjectNil
+
+ fromObject ObjectNil = return Nothing
+ fromObject obj = liftM Just $ fromObject obj
+
+-- | Pack a serializable Haskell value.
+pack :: OBJECT a => Packer -> a -> IO ()
+pack pc = packObject pc . toObject