Thanks for the reply.

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.

David

"Ertugrul Soeylemez" <e...@ertes.de> wrote in message news:20110406163105.13cbc...@angst.streitmacht.eu...
"David Hotham" <david.hot...@blueyonder.co.uk> wrote:

I've spent some time over the last couple of days trying to write an
enumeratee that prints a "." every n bytes (with obvious intended use
as a progress tracker).  Seems like it oughtn't be hard, but it has
been a steep learning curve...

I have come up with something that seems to do the job but I don't
know that I'm completely happy with it (or even that I completely
understand it, to be honest).

If anyone more expert would be kind enough either to reassure me that
I'm doing it right or - more likely - to offer improvements /
suggestions on what obvious simplifications I have overlooked, I'd be
grateful.

I think that using lazy bytestrings does not have any advantage here,
since the enumerator creates the strict bytestrings at some point, then
your enumeratee converts them into lazy ones just for counting.  Just
use the straightforward approach:  Take the chunks and count the bytes
like here:

   {-# LANGUAGE ScopedTypeVariables #-}

   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
               tryIO $ BC.putStr (BC.replicate numDots '.')
               k ch >>== loop i
       loop i' step = return step

I think, this is about the most straightforward and also the fastest
approach.


Greets,
Ertugrul


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



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to