Avoid copying if possible in `concat`
authorBen Gamari <ben@smart-cactus.org>
Sun, 15 May 2016 21:37:51 +0000 (23:37 +0200)
committerDuncan Coutts <duncan@community.haskell.org>
Sun, 13 Nov 2016 20:56:08 +0000 (20:56 +0000)
commit3c97952002593ee3b3d7cc00a9ae32fb12fa8a55
tree8ad704f9e02fb5d535eda644a1d8811100f38c93
parentb922a7b4a97c02d880f9c053e065c02aa3d2d1ca
Avoid copying if possible in `concat`

The `binary` package revealed a rather obvious missing optimization here
when it forced extraneous copies with the evaluation of `concat [a,b]`
where `a` is empty and `b` is large.

Here we rework `Data.ByteString.concat` and `Data.ByteString.Lazy.concat`
to more aggressively avoid unnecessary copies in the face of
concatentations of lists with empty chunks. This rework has the nice
advantage of avoiding allocation during computation of the final buffer
length in the case where a copy is necessary (whereas previously
`checkedSum` would fail to fuse and therefore require allocation for its
list argument).
Data/ByteString/Internal.hs
Data/ByteString/Lazy.hs
Data/ByteString/Lazy/Internal.hs