module Data.Serialize.Send (hSerialize, hDeserialize) where
import System.IO (hFlush, Handle)
import Data.Serialize
import Data.Serialize.Put
import Data.Serialize.Get
import Data.ByteString as B
import Control.Monad

-- |Serializes an object to the given handle
hSerialize :: Serialize a => Handle -> a -> IO ()
hSerialize h x = hPut h $ runPut (putWord8 (fromIntegral (B.length a))) `append` a
    where a = encode x

-- |Deserializes an object to the given handle
hDeserialize :: Serialize a => Handle -> IO a
hDeserialize h = do
    (Right l) <- liftM (runGet getWord8) (hGet h 1)
    (Right x) <- liftM decode (hGet h (fromIntegral l))
    return x