module ByteString.TreeBuilder
(
Builder,
byteString,
byte,
length,
toByteString,
toLazyByteString,
)
where
import ByteString.TreeBuilder.Prelude hiding (foldl, foldr, length)
import qualified ByteString.TreeBuilder.Tree as A
import qualified ByteString.TreeBuilder.Poker as D
import qualified ByteString.TreeBuilder.Prelude as F
import qualified Data.ByteString as B
import qualified Data.ByteString.Internal as C
import qualified Data.ByteString.Lazy.Internal as E
data Builder =
Builder !Int !A.Tree
instance Monoid Builder where
mempty =
Builder 0 A.Empty
mappend (Builder length1 tree1) (Builder length2 tree2) =
Builder (length1 + length2) (A.Branch tree1 tree2)
instance Semigroup Builder
instance IsString Builder where
fromString string =
Builder (B.length bytes) (A.Leaf bytes)
where
bytes =
fromString string
byteString :: ByteString -> Builder
byteString bytes =
Builder (B.length bytes) (A.Leaf bytes)
byte :: Word8 -> Builder
byte byte =
Builder 1 (A.Leaf (B.singleton byte))
foldl :: (a -> ByteString -> a) -> a -> Builder -> a
foldl step init (Builder length tree) =
A.foldl step init tree
foldr :: (ByteString -> a -> a) -> a -> Builder -> a
foldr step init (Builder length tree) =
A.foldr step init tree
length :: Builder -> Int
length (Builder length tree) =
length
toByteString :: Builder -> ByteString
toByteString (Builder length tree) =
C.unsafeCreate length $ \ptr ->
void $ D.pokeTree tree ptr
toLazyByteString :: Builder -> E.ByteString
toLazyByteString =
foldr E.Chunk E.Empty