{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Flat.Filler (
Filler(..),
fillerLength,
PreAligned(..),
preAligned,
PostAligned(..),
postAligned,
postAlignedDecoder
) where
import Data.Flat.Class
import Data.Flat.Encoder
import Data.Flat.Decoder
import Control.DeepSeq
import Data.Typeable
data Filler = FillerBit Filler
| FillerEnd
deriving (Show, Eq, Ord, Typeable, Generic, NFData)
instance Flat Filler where
encode _ = eFiller
size = sFillerMax
data PostAligned a = PostAligned { postValue :: a, postFiller :: Filler }
deriving (Show, Eq, Ord, Typeable, Generic, NFData,Flat)
data PreAligned a = PreAligned { preFiller :: Filler, preValue :: a }
deriving (Show, Eq, Ord, Typeable, Generic, NFData, Flat)
fillerLength :: Num a => Filler -> a
fillerLength FillerEnd = 1
fillerLength (FillerBit f) = 1 + fillerLength f
postAligned :: a -> PostAligned a
postAligned a = PostAligned a FillerEnd
preAligned :: a -> PreAligned a
preAligned = PreAligned FillerEnd
postAlignedDecoder :: Get b -> Get b
postAlignedDecoder dec = do
v <- dec
_::Filler <- decode
return v