Hi Sergey,
I've got an explanation; quite surprisingly it's a bug in enumPure1Chunk. Even though it is an odd case, I'm surprised that it hasn't come up before now since enumPure1Chunk appears frequently.
I've just uploaded 0.8.5.0 which has the fix. There's now an additional Monoid constraint on enumPure1Chunk, unfortunately.
Thanks very much for reporting this.
John L
Ok. I've checked iteratee-0.8.3.0 and 0.8.4.0. Results are same.
Sergey
2011/6/2 John Lato <jwlato@gmail.com>:
> Hi Sergey,
> I can't explain this; maybe it's a bug in enumWith? I'll look into it.
> Thanks,
> John
>
>>
>> Message: 20
>>
>> Date: Thu, 2 Jun 2011 02:46:32 +0400
>> From: Sergey Mironov <ierton@gmail.com>
>> Subject: [Haskell-cafe] [iteratee] how to do nothing .. properly
>> To: haskell-cafe@haskell.org
>> Message-ID: <BANLkTimMFRWgH9Nopt-eua+L7jQcGq+u=g@mail.gmail.com>
>> Content-Type: text/plain; charset=ISO-8859-1
>>
>> Hi. Would anybody explain a situation with iter6 and iter7 below?
>> Strange thing - first one consumes no intput, while second consumes it
>> all, while all the difference is peek which should do no processing
>> (just copy next item in stream and return to user).
>> What I am trying to do - is to write an iteratee consuing no input,
>> but returning a constant I give to it. I thought (return a) should do
>> it, but it seems I was wrong as return actually consumes all unparsed
>> stream. iter6 experience tells me that (peek>>return a) is what I
>> need, but it's completely confusing and not what I expected.
>>
>> Thanks,
>> Sergey
>>
>> import Data.Iteratee as I
>> import Data.Iteratee.IO
>> import Control.Monad
>> import Control.Exception
>> import Data.ByteString
>> import Data.Char
>> import Data.String
>>
>> -- countBytes :: (..., Num b) => Iteratee s m a -> Iteratee s m (a, b)
>> countBytes i = enumWith i I.length
>>
>> iter6 = do
>> h <- countBytes $ (peek >> return 0)
>> s <- I.stream2list
>> return (h,s)
>>
>> iter7 = do
>> h <- countBytes $ (return 0)
>> s <- I.stream2list
>> return (h,s)
>>
>> print6 = enumPure1Chunk [1..10] (iter6) >>= run >>= print
>> print7 = enumPure1Chunk [1..10] (iter7) >>= run >>= print
>>
>>
>> Here is example ghci session
>>
>> *Main> print6
>> ((0,0),[1,2,3,4,5,6,7,8,9,10])
>> -- read 0 items, returns 0
>> *Main> print7
>> ((0,10),[])
>> -- read 10 items (???) returns 0
>> *Main>
>>
>>
>>
>> ------------------------------
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>>
>> End of Haskell-Cafe Digest, Vol 94, Issue 3
>> *******************************************
>
>