protobuf-0.2.1.4: src/Data/Binary/Builder/Sized.hs
module Data.Binary.Builder.Sized where
import qualified Data.ByteString.Builder as B
import Data.Monoid (mempty, mappend, Monoid)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString as BS
import Data.Semigroup (Semigroup, (<>))
import qualified Data.Word as W
data Builder = Builder {-# UNPACK #-} !Int B.Builder
instance Semigroup Builder where
Builder i b <> Builder i' b' = Builder (i + i') (mappend b b')
instance Monoid Builder where
mempty = Builder 0 mempty
mappend = (<>)
toLazyByteString :: Builder -> LBS.ByteString
toLazyByteString (Builder _ b) = B.toLazyByteString b
size :: Builder -> Int
size (Builder i _) = i
empty :: Builder
empty = mempty
singleton :: W.Word8 -> Builder
singleton = Builder 1 . B.word8
append :: Builder -> Builder -> Builder
append = mappend
fromByteString :: BS.ByteString -> Builder
fromByteString s = Builder (BS.length s) $ B.byteString s
fromLazyByteString :: LBS.ByteString -> Builder
fromLazyByteString s = Builder (fromIntegral $ LBS.length s) $ B.lazyByteString s
putWord16be :: W.Word16 -> Builder
putWord16be = Builder 2 . B.word16BE
putWord32be :: W.Word32 -> Builder
putWord32be = Builder 4 . B.word32BE
putWord64be :: W.Word64 -> Builder
putWord64be = Builder 8 . B.word64BE
putWord16le :: W.Word16 -> Builder
putWord16le = Builder 2 . B.word16LE
putWord32le :: W.Word32 -> Builder
putWord32le = Builder 4 . B.word32LE
putWord64le :: W.Word64 -> Builder
putWord64le = Builder 8 . B.word64LE