{-# LANGUAGE ImpredicativeTypes, ConstraintKinds #-}
module Build.Task (Task, Tasks, compose) where
import Control.Applicative
type Task c k v = forall f. c f => (k -> f v) -> f v
type Tasks c k v = k -> Maybe (Task c k v)
compose :: Tasks Monad k v -> Tasks Monad k v -> Tasks Monad k v
compose :: forall k v. Tasks Monad k v -> Tasks Monad k v -> Tasks Monad k v
compose Tasks Monad k v
t1 Tasks Monad k v
t2 k
key = Tasks Monad k v
t1 k
key Maybe (Task Monad k v)
-> Maybe (Task Monad k v) -> Maybe (Task Monad k v)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Tasks Monad k v
t2 k
key