[Haskell-cafe] [Conduit] weird action of leftover.
Magicloud Magiclouds
magicloud.magiclouds at gmail.com
Tue Apr 9 06:48:12 CEST 2013
Thank you for the reply. I've learnt the code of "lines". So it is because
how ByteString works, that the conduit is not a stream of bytes, but
chunks, right?
On Tue, Apr 9, 2013 at 12:12 PM, Michael Snoyman <michael at snoyman.com>wrote:
> 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[1] for an example of the concept.
>
> Michael
>
> [1]
> http://haddocks.fpcomplete.com/fp/7.4.2/20130313-1/conduit/src/Data-Conduit-Binary.html#lines
>
>
> 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
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>
--
竹密岂妨流水过
山高哪阻野云飞
And for G+, please use magiclouds#gmail.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130409/27bf9463/attachment.htm>
More information about the Haskell-Cafe
mailing list