The desired behaviour (certainly my desired behaviour, but I think also the most useful behaviour generally) is that the enumeratee passes n bytes to its iteratee, prints a dot, and repeats.

Given that, printing the dots all in one bunch after passing bytes to the iteratee isn't any improvement over printing the dots all in one bunch before passing them to the iteratee.

I think that mostly I want it the way that I want it because that's the bit that I struggled most over and I'm now reluctant to give it up! However this might actually make a useful difference to behaviour in the case of an iteratee that did very expensive processing, or that itself performed IO. In such cases, my behaviour could be expected to give a more accurate indication of how far through processing we'd actually got.

David


PS Yes, I already tried out the code ;-). You'll see that both of my versions did indeed hFlush stdout.




"Ertugrul Soeylemez" <[email protected]> wrote in message news:[email protected]...
"David Hotham" <[email protected]> wrote:

I did have a version along those lines at some point, but I felt it
was cheating rather to print the dots not at the correct point in the
stream.

Perhaps I've over-complicated for the sake of the learning experience,
but I do like to have a version that passes on the correct number of
bytes, then prints the ".", and then continues.

Well, then just do the printing after calling the continuation:

   dotsAt :: forall b m. MonadPeelIO m => Int ->
             Enumeratee ByteString ByteString m b
   dotsAt n =
       loop 0

       where
       loop :: Int -> Enumeratee ByteString ByteString m b
       loop i' step@(Continue k) =
           continue go

           where
           go :: Stream ByteString ->
                 Iteratee ByteString m (Step ByteString m b)
           go EOF = return step
           go ch@(Chunks strs) = do
let (numDots, i) = divMod (i' + sum (L.map BC.length strs)) n printDots = tryIO $ BC.putStr (BC.replicate numDots '.') >>
                                       hFlush stdout
               k ch >>== (\step -> printDots >> loop i step)
       loop i' step = return step

By the way, after trying out the code, I found that you should use
hFlush after printing.  Otherwise you may see the dots delayed.


Greets,
Ertugrul


--
nightmare = unsafePerformIO (getWrongWife >>= sex)
http://ertes.de/



_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to