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-c...@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
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to