I guess like minds think alike! See the very recent e-mail thread
started by Ryan Ingram:
http://thread.gmane.org/gmane.comp.lang.haskell.cafe/39155/focus=39159
Take a look at the code referenced in Luke Palmer's reply:
http://luqui.org/git/?p=luqui-misc.git;a=blob;f=work/code/haskell/frp/Fregl/Suspend.hs
A snippet follows:
> class (Monad m) => MonadSuspend v m | m -> v where
> attempt :: m a -> m (Either a (v -> m a))
> suspend :: m v
>
> newtype SuspendT v m a
> = SuspendT { runSuspendT :: m (Either a (v -> SuspendT v m a)) }
Your (Coroutine m a) appears to be isomorphic to (SuspendT () m a) [so
Coroutine m () = SuspendT () m ()]
Your runCoroutineT appears to be isomorphic to a specialization of
runSuspendT:
runSuspendT' :: SuspendT () m () -> m (Either () (() -> SuspendT () m ()))
Here the () -> a ~ a and Either () a ~ Maybe a
Dan
Joachim Breitner wrote:
Hi,
(for those who follow planet.haskell.org this is old news, but I thought
I’d tell the others)
In
http://www.joachim-breitner.de/blog/archives/291-Pausable-IO-actions-for-better-GUI-responsiveness.html
I describe how I wrote a monad transformer that allows me to pause a
computation from within by returning another computation that I can use
to re-start the computation (or to throw it away if I want). I needed
this for a long running drawing computation in a gtk2hs program that I
want to pause at convenient points (to allow user interaction), and that
I need to abort when what I’m drawing is not up-to-date anymore.
The API basically consists of the function
runCoroutineT :: Monad m => CoroutineT m () -> m (Maybe (CoroutineT m ()))
which runs the pausable computation, any Maybe returns Just the resume
action, and the function
pause :: Monad m => CoroutineT m ()
to be used inside the computation, which pauses it.
I have put the complete module in the darcs repository that might later
also contain the GUI program at http://darcs.nomeata.de/FrakView/
What do you think of CoroutineT? Could it have been easily implemented
using the existing monad transformers? Is it useful enough so that it
should be included somewhere, and where? Are there any problems with
strictness or other tripping points that I have overlooked?
Greetings,
Joachim
------------------------------------------------------------------------
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe