> module Control.Hmk where > > type Cmp m a = a -> a -> m Bool > data Result = TaskSuccess | TaskFailure > type Task m = m Result > data Rule m a = Rule { target :: a > , prereqs :: [a] > , recipe :: Maybe ([a] -> Task m) > , isStale :: Cmp m a } > type DepGraph m a = [Tree m a] > data Tree m a = Node a (DepGraph m a) (Rule m a)