Hi Hakell Cafe,
import Control.Exceptionimport Control.Monadimport Control.Monad.Transimport Data.IterIOimport Data.IterIO.Inumimport Networkimport System.IOimport System.IO.Error (isEOFError)import qualified Data.ByteString.Lazy as Limport qualified Data.ByteString.Lazy.Char8 as C
iterHandle' :: (MonadIO m) => Handle -> IO (Iter L.ByteString m (), Onum L.ByteString m a)iterHandle' = iterHandlemain = withSocketsDo $ dosListen <- listenOn (PortNumber 8000)putStrLn "Listening on Port 8000"forkIO $ forever $ do(sSession, hostname, port) <- accept sListenhSetBuffering sSession NoBufferingputStrLn ("Connected to " ++ hostname ++ ":" ++ show port)forkIO $ do(iter, enum) <- iterHandle' sSessionenum |$ inumReverseLines .| iterputStrLn "Press <CTRL-D> to quit."exitOnCtrlDinumReverseLines :: (Monad m) => Inum L.ByteString L.ByteString m ainumReverseLines = mkInum $ doline <- lineIreturn (L.reverse (L.concat [line, C.pack "\n"]))
exitOnCtrlD = try getLine >>= either(\e -> unless (isEOFError e) $ ioError e)(const exitOnCtrlD)
asdfghc7@hoggy-nn:/home/hoggy$ nc localhost 80001234432143211234abcdeedcba
enum |$ inumReverseLines .| iterinumReverseLines = mkInum $ doline <- lineIreturn (L.reverse (L.concat [line, C.pack "\n"]))