
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,
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