module Network.HPACK.Builder.Word8 where import Data.ByteString.Internal (ByteString, unsafeCreate) import Data.Word (Word8) import Foreign.Storable (poke) import Foreign.Ptr (plusPtr) data Word8Builder = Word8Builder !Int ([Word8] -> [Word8]) (<|) :: Word8Builder -> Word8 -> Word8Builder Word8Builder i b <| w = Word8Builder (i+1) $ b . (w :) w8empty :: Word8Builder w8empty = Word8Builder 0 id {- singleton :: Word8 -> Word8Builder singleton x = Word8Builder 1 (x :) -} toByteString :: Word8Builder -> ByteString toByteString (Word8Builder i b) = unsafeCreate i $ \ptr -> go ptr ws where ws = b [] go _ [] = return () go ptr (x:xs) = do poke ptr x go (ptr `plusPtr` 1) xs