module OpenAFP.Types.Buffer where
import OpenAFP.Internals
import Data.Binary.Get
import Data.Binary.Put
import qualified Data.ByteString as S
import qualified Data.ByteString.Lazy as L
class (Show a, Typeable a) => Buf a where
mkBuf :: BS -> a
packBuf :: a -> BS
newtype Buffer0 = Buf0 { fromBuf0 :: BS } deriving (Show, Typeable)
newtype Buffer1 = Buf1 { fromBuf1 :: BS } deriving (Show, Typeable)
newtype Buffer2 = Buf2 { fromBuf2 :: BS } deriving (Show, Typeable)
instance Buf Buffer0 where
mkBuf = Buf0
packBuf = fromBuf0
instance Buf Buffer1 where
mkBuf = Buf1
packBuf = fromBuf1
instance Buf Buffer2 where
mkBuf = Buf2
packBuf = fromBuf2
instance Binary Buffer0 where
put (Buf0 bs) = putByteString bs
get = fmap (Buf0 . S.concat . L.toChunks) getRemainingLazyByteString
instance Binary Buffer1 where
put (Buf1 bs) = do
putWord8 $ toEnum (S.length bs) + 1
putByteString bs
get = do
sz <- getWord8
bs <- getByteString $ fromEnum sz 1
return (Buf1 bs)
instance Binary Buffer2 where
put (Buf2 bs) = do
putWord16be $ toEnum (S.length bs) + 2
putByteString bs
get = do
sz <- getWord16be
bs <- getByteString $ fromEnum sz 2
return (Buf2 bs)