module NetworkedGame.Packet where import qualified Data.ByteString.Lazy as B import Data.Binary (Binary,encode,decode) import Data.Int (Int64) import System.IO (Handle, hFlush) newtype Packet = Packet B.ByteString mkPacket :: Binary a => a -> Packet mkPacket x = Packet $ B.append (encode n) bs where n = B.length bs bs = encode x hPutPacket :: Handle -> Packet -> IO () hPutPacket h (Packet bs) = B.hPutStr h bs >> hFlush h hGetPacketed :: Binary a => Handle -> IO a hGetPacketed h = do nEnc <- B.hGet h 8 let n :: Int64 n = decode nEnc bs <- B.hGet h $ fromIntegral n return $ decode bs