{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ExistentialQuantification #-}
module Data.IPCVar.Backend where
import Control.Exception
import Data.Binary
import Data.ByteString.Lazy
import Data.Text.Lazy as Text
import Data.Text.Lazy.Encoding as Text
import System.IO hiding (hGetContents)
import System.Posix.IO
import System.Posix.Types
data IPCVarBackend a = Binary a => IPCVarBackend
{ readValue :: IO a
, writeValue :: a -> IO ()
, swapValue :: a -> IO a
, deleteValue :: IO ()
, encodeState :: ByteString
}
newtype IPCVar a = IPCVar { getIPCVarBackend :: IPCVarBackend a }
encodeFd :: Binary a => Fd -> a -> IO ()
encodeFd fd x = do
!_ <- fdWrite fd (Text.unpack (Text.decodeUtf8 (encode x)))
return ()
decodeFd :: Binary a => Fd -> IO a
decodeFd fd = do
sz <- fdSeek fd SeekFromEnd 0
!_ <- fdSeek fd AbsoluteSeek 0
(!bs, !sz') <- fdRead fd (fromIntegral sz)
assert (sz == fromIntegral sz') $
return $ decode (Text.encodeUtf8 (Text.pack bs))