I'm sorry, but I don't fully understand what do you want from putback.

If putback'ed action does io and then returns x, it's trivial:

    putback x io = io >> return x

If you want putback'ed action to return x on its first call and do io on second, third... calls, then you need to put somewhere a mark indicating that action was called. You can use IORefs.

    import Data.IORef
    import System.IO.Unsafe

    putback x io = do
      m <- readIORef r
      if m then io else (writeIORef r True >> return x)
      where
        r = unsafePerformIO $ newIORef False


Sergey Mironov <ier...@gmail.com> писал(а) в своём письме Sun, 15 May 2011 17:33:51 +0300:

Hi Cafe. I wonder if it is possible to write a IO putback function
with following interface

putback :: a -> IO a -> IO a
putback x io = ???


where io is some action like reading from file or socket.
I want putback to build new action which will return x on first call,
and continue executing io after that.

Thanks in advance!
Sergey.

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

Reply via email to