{- | 

Task monad transformer can help refactor event and callback heavy
programs into monads via co-routines. The idea is loosely
based on /Combining Events And Threads For Scalable Network Services/,
by Peng Li and Steve Zdancewic, in /PLDI/, 2007.
(<http://www.cis.upenn.edu/~stevez/papers/abstracts.html#LZ07>), but
with deterministic and co-operative lightweight threads,
also known as co-routines, so that the base monad can be anything ranging 
from IO to state monads, or your favorite monad transformer stack.

Besides, Task monad transformer also provides a simple mechanism to signal
and watch for events, which allows complex event processing logic to be
expressed as streamlined monadic co-routines.

Task monad transformer is essentially a ContT, or continuation transformer,
defined to extract the control flow of monadic programs with co-operative
multi-threading. After the CPS transformation, the program trace is then
executed with a simple round-robin scheduler.

-}

module Control.Monad.Task
  ( -- * MonadTask class
    MonadTask(..)
    -- * TaskT monad transformer
  , TaskT (..)
    -- * Functions
  , runTask
  , orElse
  ) where

import Control.Monad.Trans.Task
import Control.Monad.Task.Class