[Haskell-cafe] generic putback

Artyom Kazak artyom.kazak at gmail.com
Sun May 15 17:02:41 CEST 2011

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)
         r = unsafePerformIO $ newIORef False

Sergey Mironov <ierton at 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.

More information about the Haskell-Cafe mailing list