pandora-0.5.6: Pandora/Paradigm/Primary/Functor/Fix.hs
module Pandora.Paradigm.Primary.Functor.Fix where
import Pandora.Core.Functor (type (<:=), type (:=>))
import Pandora.Pattern.Semigroupoid ((.))
import Pandora.Pattern.Functor.Covariant (Covariant ((<-|-)))
import Pandora.Pattern.Operation.Exponential ()
newtype Fix t = Fix { unfix :: t (Fix t) }
cata :: Covariant (->) (->) t => (a <:= t) -> Fix t -> a
cata f = f . (cata f <-|-) . unfix
ana :: Covariant (->) (->) t => (a :=> t) -> a -> Fix t
ana f = Fix . (ana f <-|-) . f
hylo :: Covariant (->) (->) t => (b <:= t) -> (a :=> t) -> (a -> b)
hylo phi psi = cata phi . ana psi