Thanks David,

Right - it invokes its iter repeatedly because mkInumC does that and mkInum is defined as:

mkInum = mkInumC id noCtl

So to do it all manually is:

inumReverseLines :: (Monad m) => Inum L.ByteString L.ByteString m a
inumReverseLines = mkInumM $ loop where
  loop = do
    eof <- atEOFI
    unless eof $ do
      line <- lineI
      ifeed (L.concat [L.reverse line, C.pack "\n"])
      loop

Cheers,

-John

On 1 July 2011 01:20, <dm-list-haskell-cafe@scs.stanford.edu> wrote:
At Thu, 30 Jun 2011 23:53:02 +1000,
John Ky wrote:
>
> But all I've done is:
>
>     enum |$ inumReverseLines .| iter
>
>     inumReverseLines = mkInum $ do
>       line <- lineI
>       return (L.reverse (L.concat [line, C.pack "\n"]))

mkInum repeatedly invokes its iter argument so as to keep producing
chunks.  If you want to reverse only one line, it might be easiest to
use something along the lines of:

   mkInumM $ do
     line <- lineI
     ifeed (L.reverse (L.concat [line, C.pack "\n"]))

mkInumM is a more manual Inum construction function that doesn't
automatically do things like loop or handle EOF conditions.

David