<div class="gmail_quote"><div>Hi Sergey,</div><div><br></div><div>I can&#39;t explain this; maybe it&#39;s a bug in enumWith?  I&#39;ll look into it.</div><div><br></div><div>Thanks,</div><div>John</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Message: 20</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Date: Thu, 2 Jun 2011 02:46:32 +0400<br>
From: Sergey Mironov &lt;<a href="mailto:ierton@gmail.com">ierton@gmail.com</a>&gt;<br>
Subject: [Haskell-cafe] [iteratee] how to do nothing .. properly<br>
To: <a href="mailto:haskell-cafe@haskell.org">haskell-cafe@haskell.org</a><br>
Message-ID: &lt;BANLkTimMFRWgH9Nopt-eua+L7jQcGq+u=<a href="mailto:g@mail.gmail.com">g@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
Hi. Would anybody explain a situation with iter6 and iter7 below?<br>
Strange thing - first one consumes no intput, while second consumes it<br>
all, while all the difference is peek  which should do no processing<br>
(just copy next item in stream and return to user).<br>
What I am trying to do - is to write an iteratee consuing no input,<br>
but returning a constant I give to it. I thought (return a) should do<br>
it, but it seems I was wrong as return actually consumes all unparsed<br>
stream. iter6 experience tells me that (peek&gt;&gt;return a) is what I<br>
need, but it&#39;s completely confusing and not what I expected.<br>
<br>
Thanks,<br>
Sergey<br>
<br>
 import Data.Iteratee as I<br>
 import <a href="http://Data.Iteratee.IO" target="_blank">Data.Iteratee.IO</a><br>
 import Control.Monad<br>
 import Control.Exception<br>
 import Data.ByteString<br>
 import Data.Char<br>
 import Data.String<br>
<br>
 -- countBytes :: (..., Num b) =&gt; Iteratee s m a -&gt; Iteratee s m (a, b)<br>
 countBytes i = enumWith i I.length<br>
<br>
 iter6 = do<br>
     h &lt;- countBytes $ (peek &gt;&gt; return 0)<br>
     s &lt;- I.stream2list<br>
     return (h,s)<br>
<br>
 iter7 = do<br>
     h &lt;- countBytes $ (return 0)<br>
     s &lt;- I.stream2list<br>
     return (h,s)<br>
<br>
 print6 = enumPure1Chunk [1..10] (iter6) &gt;&gt;= run &gt;&gt;= print<br>
 print7 = enumPure1Chunk [1..10] (iter7) &gt;&gt;= run &gt;&gt;= print<br>
<br>
<br>
Here is example ghci session<br>
<br>
*Main&gt; print6<br>
((0,0),[1,2,3,4,5,6,7,8,9,10])<br>
-- read 0 items, returns 0<br>
*Main&gt; print7<br>
((0,10),[])<br>
-- read 10 items (???) returns 0<br>
*Main&gt;<br>
<br>
<br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br>
<br>
End of Haskell-Cafe Digest, Vol 94, Issue 3<br>
*******************************************<br>
</blockquote></div><br>