[iteratee] how to do nothing .. properly

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>
participants (1)
-
Sergey Mironov