
Thanks for your answer. That makes sense. In particular the fact that there should be no need to read own output.
However, one problem remains. Data format I am working with contains a total-length prefix. That is:
2 bytes of total length somewhere in the header of the message (header is of the fixed length). But the builder does not directly provide length.
So, how do I suppose to effectively encode the message in the form:
msg = header <> chunk1 <> chunk2 <> ...
Should I use (Builder, Sum Int) instead of plain Builder when composing?
Or
data MyBuilder = MyBuilder Builder Int
... and create a Monoid instance?
Or any other approach?
Zoran
----- Original Message -----
From: "Viktor Dukhovni"
if I understand correctly, the ByteString.Builder is used to efficiently construct sequence of bytes from smaller parts.
Best used in continuation-passing-style (right-associatively), where all the subsequent builders are lazily added as part of constructing the "head" builder.
builder = chunk1 <> (chunk2 <> (chunk3 <> (... <> chunkN)...))
Repeatedly appending tail chunks (effectively left-associate) is noticeably less efficient (similar to lists). A work-around is to instead append (Builder->Builder) endomorphisms.
b1 = Endo (mappend chunk1) b2 = b1 <> Endo (mappend chunk2) b3 = b2 <> Endo (mappend chunk3) ... bN = ...
Actually, this part is was a myth I failed to check, looking at the `Builder` code, I see that builder `mappend` is already endomorphism composition, so the extra wrapping is redundant. So use builders for output, and don't attempt to model some hybrid of builders and bytestrings. It is rather unclear what problem that is actually intended to solve. -- Viktor. _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.