\Glspl{Task} can be combined using so called \gls{Task}-combinators.
Combinators describe relations between \glspl{Task}. There are only two basic
types of combinators; parallel and sequence. All other combinators are
derived from the basic combinators. Type signatures of simplified versions of
the basic combinators and their derivations are given in
Listing~\ref{lst:combinators}

\begin{lstlisting}[%
	caption={\Gls{Task}-combinators},label={lst:combinators}]
//Step combinator
(>>=)  infixl 1 :: (Task a) (a -> Task b)         -> Task b   | iTask a & iTask b
(>>*)  infixl 1 :: (Task a) [TaskCont a (Task b)] -> Task b     | iTask a & iTask b
:: TaskCont a b
	=     OnValue             ((TaskValue a)  -> Maybe b)
	|     OnAction    Action  ((TaskValue a)  -> Maybe b)
	| E.e: OnException         (e              -> b)       & iTask e
	|     OnAllExceptions     (String         -> b)
:: Action = Action String

//Parallel combinators
(-||-) infixr 3 :: (Task a) (Task a)              -> Task a     | iTask a
(||-)  infixr 3 :: (Task a) (Task b)              -> Task b     | iTask a & iTask b
(-||)  infixl 3 :: (Task a) (Task b)              -> Task a     | iTask a & iTask b
(-&&-) infixr 4 :: (Task a) (Task b)              -> Task (a,b) | iTask a & iTask b
\end{lstlisting}

\paragraph{Sequence:}
The implementation for the sequence combinator is called the
\CI{step} (\CI{>>*}). This combinator runs the left-hand \gls{Task} and
starts the right-hand side when a certain predicate holds. Predicates
can be propositions about the \CI{TaskValue}, user actions from within
the web browser or a thrown exception. The familiar
bind-combinator is an example of a sequence combinator. This combinator
runs the left-hand side and continues to the right-hand \gls{Task} if
there is an \CI{UnStable} value and the user presses continue or when
the value is \CI{Stable}. The combinator could have been implemented
as follows:
\begin{lstlisting}[language=Clean]
(>>=) infixl 1 :: (Task a) (a -> (Task b)) -> (Task b) | iTask a & iTask b
(>>=) ta f = ta >>* [OnAction "Continue" onValue, OnValue onStable]
    where
        onValue (Value a _)     = Just (f a)
        onValue _               = Nothing

        onStable (Value a True) = Just (f a)
        onStable _              = Nothing
\end{lstlisting}

\paragraph{Parallel:}
The parallel combinator allows for concurrent \glspl{Task}. The
\glspl{Task} combined with these operators will appear at the same time
in the web browser of the user and the results are combined as the type
dictates. All parallel combinators used are derived from the basic parallel
combinator that is very complex and only used internally.
