module IxOutputM (HasOutput(..), OutputM, foldOutput, listOutput, mapOutput) where import MT import Control_Monad_Fix import Tree data OutputM o a = O a (Tree o) foldOutput :: b -> (o -> b) -> (b -> b -> b) -> OutputM o a -> (a,b) foldOutput e s j (O x tree) = (x, Tree.fold e s j tree) listOutput :: OutputM o a -> (a,[o]) listOutput (O x o) = (x, Tree.toList o) mapOutput :: (o -> p) -> OutputM o a -> OutputM p a mapOutput f (O x tree) = O x (fmap f tree) instance Functor (OutputM o) where fmap f (O x o) = O (f x) o instance Monad (OutputM o) where return x = O x Tree.Empty O x o >>= f = let O y p = f x in O y (o `Tree.merge` p) O x o >> O y p = O y (o `Tree.merge` p) instance HasOutput (OutputM o) Z o where outputTree _ t = O () t instance MonadFix (OutputM o) where mfix f = let it@(O a _) = f a in it instance HasBaseMonad (OutputM o) (OutputM o) where inBase = id