fact: Fixpoint iterTi `{Functor f} `{Monad m} `(phi : f (m a) -> m a) (ft : FreeTi f m a) : m a := match ft with FT s k z => y <- z ; match y with | Pure x => @pure m _ a x | Free x => phi (fmap (iterTi phi \o k) x) end end.
imports: Hask.Control.Monad