\Glspl{Task} in \gls{iTasks} 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}[language=Clean,%
	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.
