[Haskell-cafe] [Conduit] weird action of leftover.
michael at snoyman.com
Tue Apr 9 06:12:34 CEST 2013
It's a bug in your implementation of takeLine I believe. It doesn't take
into account that lines can span multiple chunks. When you call takeLine
the first time, you get "L1\n". leftover puts a chunk with exactly those
contents back. When you call takeLine the second time, it gets the chunk
"L1\n", and your splitAt gives you back "L1\n" and "". The "" is then
leftover, and the next call to takeLine gets it.
Your takeLine needs to include logic saying "there's no newline in this
chunk at all, let's get the next chunk and try that." You can look at the
source to lines for an example of the concept.
On Mon, Apr 8, 2013 at 8:44 AM, Magicloud Magiclouds <
magicloud.magiclouds at gmail.com> wrote:
> Say I have code like below. If I comment the leftover in main, I got (Just
> "L1\n", Just "L2\n", Just "L3\n", Just "L4\n"). But if I did not comment
> the leftover, then I got (Just "L1\n", Just "L1\n", Just "", Just "L2\n").
> Why is not it (Just "L1\n", Just "L1\n", Just "L2\n", Just "L3\n")?
> takeLine :: (Monad m) => Consumer ByteString m (Maybe ByteString)
> takeLine = do
> mBS <- await
> case mBS of
> Nothing -> return Nothing
> Just bs ->
> case DBS.elemIndex _lf bs of
> Nothing -> return $ Just bs
> Just i -> do
> let (l, ls) = DBS.splitAt (i + 1) bs
> leftover ls
> return $ Just l
> main = do
> m <- runResourceT $ sourceFile "test.simple" $$ (do
> a <- takeLine
> leftover $ fromJust a
> b <- takeLine
> c <- takeLine
> d <- takeLine
> return (a, b, c, d))
> print m
> And for G+, please use magiclouds#gmail.com.
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe