serialise-0.1.0.0: bench/micro/Micro/CBOR.hs
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Micro.CBOR (serialise, deserialise) where
import Micro.Types
import Codec.Serialise.Class
import Codec.Serialise.Encoding
import Codec.Serialise.Decoding hiding (DecodeAction(Done, Fail))
import qualified Codec.Serialise as Serialise
import Data.Monoid
import qualified Data.ByteString.Lazy as BS
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
import Data.Word
#endif
serialise :: Tree -> BS.ByteString
serialise = Serialise.serialise
deserialise :: BS.ByteString -> Tree
deserialise = Serialise.deserialise
encodeCtr0 :: Word -> Encoding
encodeCtr2 :: (Serialise a, Serialise b) => Word -> a -> b -> Encoding
encodeCtr0 n = encodeListLen 1 <> encode (n :: Word)
encodeCtr2 n a b = encodeListLen 3 <> encode (n :: Word) <> encode a <> encode b
{-# INLINE encodeCtr0 #-}
{-# INLINE encodeCtr2 #-}
{-# INLINE decodeCtrTag #-}
{-# INLINE decodeCtrBody0 #-}
{-# INLINE decodeCtrBody2 #-}
decodeCtrTag :: Decoder s (Word, Int)
decodeCtrTag = (\len tag -> (tag, len)) <$> decodeListLen <*> decodeWord
decodeCtrBody0 :: Int -> a -> Decoder s a
decodeCtrBody0 1 f = pure f
decodeCtrBody0 x _ = error $ "decodeCtrBody0: impossible tag " ++ show x
decodeCtrBody2
:: (Serialise a, Serialise b) => Int -> (a -> b -> c) -> Decoder s c
decodeCtrBody2 3 f = do x1 <- decode
x2 <- decode
return (f x1 x2)
decodeCtrBody2 x _ = error $ "decodeCtrBody2: impossible tag " ++ show x
instance Serialise Tree where
encode Leaf = encodeCtr0 1
encode (Fork a b) = encodeCtr2 2 a b
decode = do
(t,l) <- decodeCtrTag
case t of
1 -> decodeCtrBody0 l Leaf
2 -> decodeCtrBody2 l Fork
x -> error $ "Serialise Tree: decode: impossible tag " ++ show x