{-# LANGUAGE DerivingVia #-}
module Control.Monad.Freer.Tree where
import Control.Applicative (Alternative)
import Control.Effect (type (~>))
import Control.Freer (Freer, interpretFreer, liftIns, transformFreer)
import Control.Monad (MonadPlus)
import Control.Monad.Cont (Cont, ContT (ContT), runCont)
import Control.Monad.Free (Free (Free, Pure), hoistFree, liftF)
import Control.Monad.Freer (MonadFreer, interpretFreerK)
import Control.Monad.Identity (Identity (Identity), runIdentity)
import Data.Functor.Coyoneda (Coyoneda (Coyoneda), hoistCoyoneda, liftCoyoneda)
newtype FreerTree f a = FreerTree {forall (f :: * -> *) a. FreerTree f a -> Free (Coyoneda f) a
unFreerTree :: Free (Coyoneda f) a}
deriving newtype
( forall a b. a -> FreerTree f b -> FreerTree f a
forall a b. (a -> b) -> FreerTree f a -> FreerTree f b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (f :: * -> *) a b. a -> FreerTree f b -> FreerTree f a
forall (f :: * -> *) a b.
(a -> b) -> FreerTree f a -> FreerTree f b
<$ :: forall a b. a -> FreerTree f b -> FreerTree f a
$c<$ :: forall (f :: * -> *) a b. a -> FreerTree f b -> FreerTree f a
fmap :: forall a b. (a -> b) -> FreerTree f a -> FreerTree f b
$cfmap :: forall (f :: * -> *) a b.
(a -> b) -> FreerTree f a -> FreerTree f b
Functor
, forall a. a -> FreerTree f a
forall a b. FreerTree f a -> FreerTree f b -> FreerTree f a
forall a b. FreerTree f a -> FreerTree f b -> FreerTree f b
forall a b. FreerTree f (a -> b) -> FreerTree f a -> FreerTree f b
forall a b c.
(a -> b -> c) -> FreerTree f a -> FreerTree f b -> FreerTree f c
forall (f :: * -> *). Functor (FreerTree f)
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (f :: * -> *) a. a -> FreerTree f a
forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f a
forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f b
forall (f :: * -> *) a b.
FreerTree f (a -> b) -> FreerTree f a -> FreerTree f b
forall (f :: * -> *) a b c.
(a -> b -> c) -> FreerTree f a -> FreerTree f b -> FreerTree f c
<* :: forall a b. FreerTree f a -> FreerTree f b -> FreerTree f a
$c<* :: forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f a
*> :: forall a b. FreerTree f a -> FreerTree f b -> FreerTree f b
$c*> :: forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f b
liftA2 :: forall a b c.
(a -> b -> c) -> FreerTree f a -> FreerTree f b -> FreerTree f c
$cliftA2 :: forall (f :: * -> *) a b c.
(a -> b -> c) -> FreerTree f a -> FreerTree f b -> FreerTree f c
<*> :: forall a b. FreerTree f (a -> b) -> FreerTree f a -> FreerTree f b
$c<*> :: forall (f :: * -> *) a b.
FreerTree f (a -> b) -> FreerTree f a -> FreerTree f b
pure :: forall a. a -> FreerTree f a
$cpure :: forall (f :: * -> *) a. a -> FreerTree f a
Applicative
, forall a. a -> FreerTree f a
forall a b. FreerTree f a -> FreerTree f b -> FreerTree f b
forall a b. FreerTree f a -> (a -> FreerTree f b) -> FreerTree f b
forall (f :: * -> *). Applicative (FreerTree f)
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
forall (f :: * -> *) a. a -> FreerTree f a
forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f b
forall (f :: * -> *) a b.
FreerTree f a -> (a -> FreerTree f b) -> FreerTree f b
return :: forall a. a -> FreerTree f a
$creturn :: forall (f :: * -> *) a. a -> FreerTree f a
>> :: forall a b. FreerTree f a -> FreerTree f b -> FreerTree f b
$c>> :: forall (f :: * -> *) a b.
FreerTree f a -> FreerTree f b -> FreerTree f b
>>= :: forall a b. FreerTree f a -> (a -> FreerTree f b) -> FreerTree f b
$c>>= :: forall (f :: * -> *) a b.
FreerTree f a -> (a -> FreerTree f b) -> FreerTree f b
Monad
, forall a. FreerTree f a
forall a. FreerTree f a -> FreerTree f [a]
forall a. FreerTree f a -> FreerTree f a -> FreerTree f a
forall (f :: * -> *).
Applicative f
-> (forall a. f a)
-> (forall a. f a -> f a -> f a)
-> (forall a. f a -> f [a])
-> (forall a. f a -> f [a])
-> Alternative f
forall {f :: * -> *}. Alternative f => Applicative (FreerTree f)
forall (f :: * -> *) a. Alternative f => FreerTree f a
forall (f :: * -> *) a.
Alternative f =>
FreerTree f a -> FreerTree f [a]
forall (f :: * -> *) a.
Alternative f =>
FreerTree f a -> FreerTree f a -> FreerTree f a
many :: forall a. FreerTree f a -> FreerTree f [a]
$cmany :: forall (f :: * -> *) a.
Alternative f =>
FreerTree f a -> FreerTree f [a]
some :: forall a. FreerTree f a -> FreerTree f [a]
$csome :: forall (f :: * -> *) a.
Alternative f =>
FreerTree f a -> FreerTree f [a]
<|> :: forall a. FreerTree f a -> FreerTree f a -> FreerTree f a
$c<|> :: forall (f :: * -> *) a.
Alternative f =>
FreerTree f a -> FreerTree f a -> FreerTree f a
empty :: forall a. FreerTree f a
$cempty :: forall (f :: * -> *) a. Alternative f => FreerTree f a
Alternative
, forall a. FreerTree f a
forall a. FreerTree f a -> FreerTree f a -> FreerTree f a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
forall {f :: * -> *}. MonadPlus f => Monad (FreerTree f)
forall {f :: * -> *}. MonadPlus f => Alternative (FreerTree f)
forall (f :: * -> *) a. MonadPlus f => FreerTree f a
forall (f :: * -> *) a.
MonadPlus f =>
FreerTree f a -> FreerTree f a -> FreerTree f a
mplus :: forall a. FreerTree f a -> FreerTree f a -> FreerTree f a
$cmplus :: forall (f :: * -> *) a.
MonadPlus f =>
FreerTree f a -> FreerTree f a -> FreerTree f a
mzero :: forall a. FreerTree f a
$cmzero :: forall (f :: * -> *) a. MonadPlus f => FreerTree f a
MonadPlus
, FreerTree f a -> FreerTree f a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (f :: * -> *) a.
(Eq1 f, Eq a) =>
FreerTree f a -> FreerTree f a -> Bool
/= :: FreerTree f a -> FreerTree f a -> Bool
$c/= :: forall (f :: * -> *) a.
(Eq1 f, Eq a) =>
FreerTree f a -> FreerTree f a -> Bool
== :: FreerTree f a -> FreerTree f a -> Bool
$c== :: forall (f :: * -> *) a.
(Eq1 f, Eq a) =>
FreerTree f a -> FreerTree f a -> Bool
Eq
, FreerTree f a -> FreerTree f a -> Bool
FreerTree f a -> FreerTree f a -> Ordering
FreerTree f a -> FreerTree f a -> FreerTree f a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {f :: * -> *} {a}. (Ord1 f, Ord a) => Eq (FreerTree f a)
forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Bool
forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Ordering
forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> FreerTree f a
min :: FreerTree f a -> FreerTree f a -> FreerTree f a
$cmin :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> FreerTree f a
max :: FreerTree f a -> FreerTree f a -> FreerTree f a
$cmax :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> FreerTree f a
>= :: FreerTree f a -> FreerTree f a -> Bool
$c>= :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Bool
> :: FreerTree f a -> FreerTree f a -> Bool
$c> :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Bool
<= :: FreerTree f a -> FreerTree f a -> Bool
$c<= :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Bool
< :: FreerTree f a -> FreerTree f a -> Bool
$c< :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Bool
compare :: FreerTree f a -> FreerTree f a -> Ordering
$ccompare :: forall (f :: * -> *) a.
(Ord1 f, Ord a) =>
FreerTree f a -> FreerTree f a -> Ordering
Ord
, ReadPrec [FreerTree f a]
ReadPrec (FreerTree f a)
Int -> ReadS (FreerTree f a)
ReadS [FreerTree f a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (f :: * -> *) a.
(Read1 f, Read a) =>
ReadPrec [FreerTree f a]
forall (f :: * -> *) a.
(Read1 f, Read a) =>
ReadPrec (FreerTree f a)
forall (f :: * -> *) a.
(Read1 f, Read a) =>
Int -> ReadS (FreerTree f a)
forall (f :: * -> *) a. (Read1 f, Read a) => ReadS [FreerTree f a]
readListPrec :: ReadPrec [FreerTree f a]
$creadListPrec :: forall (f :: * -> *) a.
(Read1 f, Read a) =>
ReadPrec [FreerTree f a]
readPrec :: ReadPrec (FreerTree f a)
$creadPrec :: forall (f :: * -> *) a.
(Read1 f, Read a) =>
ReadPrec (FreerTree f a)
readList :: ReadS [FreerTree f a]
$creadList :: forall (f :: * -> *) a. (Read1 f, Read a) => ReadS [FreerTree f a]
readsPrec :: Int -> ReadS (FreerTree f a)
$creadsPrec :: forall (f :: * -> *) a.
(Read1 f, Read a) =>
Int -> ReadS (FreerTree f a)
Read
, Int -> FreerTree f a -> ShowS
[FreerTree f a] -> ShowS
FreerTree f a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
Int -> FreerTree f a -> ShowS
forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
[FreerTree f a] -> ShowS
forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
FreerTree f a -> String
showList :: [FreerTree f a] -> ShowS
$cshowList :: forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
[FreerTree f a] -> ShowS
show :: FreerTree f a -> String
$cshow :: forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
FreerTree f a -> String
showsPrec :: Int -> FreerTree f a -> ShowS
$cshowsPrec :: forall (f :: * -> *) a.
(Functor f, Show1 f, Show a) =>
Int -> FreerTree f a -> ShowS
Show
)
deriving stock (forall a. FreerTree f a -> Bool
forall m a. Monoid m => (a -> m) -> FreerTree f a -> m
forall a b. (a -> b -> b) -> b -> FreerTree f a -> b
forall (f :: * -> *) a.
(Foldable f, Eq a) =>
a -> FreerTree f a -> Bool
forall (f :: * -> *) a. (Foldable f, Num a) => FreerTree f a -> a
forall (f :: * -> *) a. (Foldable f, Ord a) => FreerTree f a -> a
forall (f :: * -> *) m.
(Foldable f, Monoid m) =>
FreerTree f m -> m
forall (f :: * -> *) a. Foldable f => FreerTree f a -> Bool
forall (f :: * -> *) a. Foldable f => FreerTree f a -> Int
forall (f :: * -> *) a. Foldable f => FreerTree f a -> [a]
forall (f :: * -> *) a.
Foldable f =>
(a -> a -> a) -> FreerTree f a -> a
forall (f :: * -> *) m a.
(Foldable f, Monoid m) =>
(a -> m) -> FreerTree f a -> m
forall (f :: * -> *) b a.
Foldable f =>
(b -> a -> b) -> b -> FreerTree f a -> b
forall (f :: * -> *) a b.
Foldable f =>
(a -> b -> b) -> b -> FreerTree f a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => FreerTree f a -> a
$cproduct :: forall (f :: * -> *) a. (Foldable f, Num a) => FreerTree f a -> a
sum :: forall a. Num a => FreerTree f a -> a
$csum :: forall (f :: * -> *) a. (Foldable f, Num a) => FreerTree f a -> a
minimum :: forall a. Ord a => FreerTree f a -> a
$cminimum :: forall (f :: * -> *) a. (Foldable f, Ord a) => FreerTree f a -> a
maximum :: forall a. Ord a => FreerTree f a -> a
$cmaximum :: forall (f :: * -> *) a. (Foldable f, Ord a) => FreerTree f a -> a
elem :: forall a. Eq a => a -> FreerTree f a -> Bool
$celem :: forall (f :: * -> *) a.
(Foldable f, Eq a) =>
a -> FreerTree f a -> Bool
length :: forall a. FreerTree f a -> Int
$clength :: forall (f :: * -> *) a. Foldable f => FreerTree f a -> Int
null :: forall a. FreerTree f a -> Bool
$cnull :: forall (f :: * -> *) a. Foldable f => FreerTree f a -> Bool
toList :: forall a. FreerTree f a -> [a]
$ctoList :: forall (f :: * -> *) a. Foldable f => FreerTree f a -> [a]
foldl1 :: forall a. (a -> a -> a) -> FreerTree f a -> a
$cfoldl1 :: forall (f :: * -> *) a.
Foldable f =>
(a -> a -> a) -> FreerTree f a -> a
foldr1 :: forall a. (a -> a -> a) -> FreerTree f a -> a
$cfoldr1 :: forall (f :: * -> *) a.
Foldable f =>
(a -> a -> a) -> FreerTree f a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> FreerTree f a -> b
$cfoldl' :: forall (f :: * -> *) b a.
Foldable f =>
(b -> a -> b) -> b -> FreerTree f a -> b
foldl :: forall b a. (b -> a -> b) -> b -> FreerTree f a -> b
$cfoldl :: forall (f :: * -> *) b a.
Foldable f =>
(b -> a -> b) -> b -> FreerTree f a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> FreerTree f a -> b
$cfoldr' :: forall (f :: * -> *) a b.
Foldable f =>
(a -> b -> b) -> b -> FreerTree f a -> b
foldr :: forall a b. (a -> b -> b) -> b -> FreerTree f a -> b
$cfoldr :: forall (f :: * -> *) a b.
Foldable f =>
(a -> b -> b) -> b -> FreerTree f a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> FreerTree f a -> m
$cfoldMap' :: forall (f :: * -> *) m a.
(Foldable f, Monoid m) =>
(a -> m) -> FreerTree f a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> FreerTree f a -> m
$cfoldMap :: forall (f :: * -> *) m a.
(Foldable f, Monoid m) =>
(a -> m) -> FreerTree f a -> m
fold :: forall m. Monoid m => FreerTree f m -> m
$cfold :: forall (f :: * -> *) m.
(Foldable f, Monoid m) =>
FreerTree f m -> m
Foldable, forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall {f :: * -> *}. Traversable f => Functor (FreerTree f)
forall {f :: * -> *}. Traversable f => Foldable (FreerTree f)
forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
FreerTree f (m a) -> m (FreerTree f a)
forall (f :: * -> *) (f :: * -> *) a.
(Traversable f, Applicative f) =>
FreerTree f (f a) -> f (FreerTree f a)
forall (f :: * -> *) (m :: * -> *) a b.
(Traversable f, Monad m) =>
(a -> m b) -> FreerTree f a -> m (FreerTree f b)
forall (f :: * -> *) (f :: * -> *) a b.
(Traversable f, Applicative f) =>
(a -> f b) -> FreerTree f a -> f (FreerTree f b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTree f a -> f (FreerTree f b)
sequence :: forall (m :: * -> *) a.
Monad m =>
FreerTree f (m a) -> m (FreerTree f a)
$csequence :: forall (f :: * -> *) (m :: * -> *) a.
(Traversable f, Monad m) =>
FreerTree f (m a) -> m (FreerTree f a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FreerTree f a -> m (FreerTree f b)
$cmapM :: forall (f :: * -> *) (m :: * -> *) a b.
(Traversable f, Monad m) =>
(a -> m b) -> FreerTree f a -> m (FreerTree f b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
FreerTree f (f a) -> f (FreerTree f a)
$csequenceA :: forall (f :: * -> *) (f :: * -> *) a.
(Traversable f, Applicative f) =>
FreerTree f (f a) -> f (FreerTree f a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTree f a -> f (FreerTree f b)
$ctraverse :: forall (f :: * -> *) (f :: * -> *) a b.
(Traversable f, Applicative f) =>
(a -> f b) -> FreerTree f a -> f (FreerTree f b)
Traversable)
liftInsTree :: ins a -> FreerTree ins a
liftInsTree :: forall (ins :: * -> *) a. ins a -> FreerTree ins a
liftInsTree = forall (f :: * -> *) a. Free (Coyoneda f) a -> FreerTree f a
FreerTree forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) (m :: * -> *) a.
(Functor f, MonadFree f m) =>
f a -> m a
liftF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. f a -> Coyoneda f a
liftCoyoneda
{-# INLINE liftInsTree #-}
interpretTree :: Monad m => (ins ~> m) -> FreerTree ins a -> m a
interpretTree :: forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
(ins ~> m) -> FreerTree ins a -> m a
interpretTree ins ~> m
i (FreerTree Free (Coyoneda ins) a
m) =
case Free (Coyoneda ins) a
m of
Pure a
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
Free (Coyoneda b -> Free (Coyoneda ins) a
f ins b
e) -> ins ~> m
i ins b
e forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
(ins ~> m) -> FreerTree ins a -> m a
interpretTree ins ~> m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Free (Coyoneda f) a -> FreerTree f a
FreerTree forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Free (Coyoneda ins) a
f
interpretTreeK :: (e ~> Cont r) -> FreerTree e ~> Cont r
interpretTreeK :: forall (e :: * -> *) r. (e ~> Cont r) -> FreerTree e ~> Cont r
interpretTreeK e ~> ContT r Identity
i (FreerTree Free (Coyoneda e) x
m) =
case Free (Coyoneda e) x
m of
Pure x
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure x
x
Free (Coyoneda b -> Free (Coyoneda e) x
f e b
e) ->
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT \x -> Identity r
k ->
forall a. a -> Identity a
Identity forall a b. (a -> b) -> a -> b
$
forall r a. Cont r a -> (a -> r) -> r
runCont
(e ~> ContT r Identity
i e b
e)
((forall r a. Cont r a -> (a -> r) -> r
`runCont` forall a. Identity a -> a
runIdentity forall b c a. (b -> c) -> (a -> b) -> a -> c
. x -> Identity r
k) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (e :: * -> *) r. (e ~> Cont r) -> FreerTree e ~> Cont r
interpretTreeK e ~> ContT r Identity
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Free (Coyoneda f) a -> FreerTree f a
FreerTree forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> Free (Coyoneda e) x
f)
instance Freer Monad FreerTree where
liftIns :: forall (ins :: * -> *) a. ins a -> FreerTree ins a
liftIns = forall (ins :: * -> *) a. ins a -> FreerTree ins a
liftInsTree
interpretFreer :: forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
(ins ~> m) -> FreerTree ins a -> m a
interpretFreer = forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
(ins ~> m) -> FreerTree ins a -> m a
interpretTree
transformFreer :: forall (e :: * -> *) (e' :: * -> *) a.
(e ~> e') -> FreerTree e a -> FreerTree e' a
transformFreer e ~> e'
phi = forall (f :: * -> *) a. Free (Coyoneda f) a -> FreerTree f a
FreerTree forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (g :: * -> *) (f :: * -> *) b.
Functor g =>
(forall a. f a -> g a) -> Free f b -> Free g b
hoistFree (forall (f :: * -> *) (g :: * -> *) b.
(forall a. f a -> g a) -> Coyoneda f b -> Coyoneda g b
hoistCoyoneda e ~> e'
phi) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. FreerTree f a -> Free (Coyoneda f) a
unFreerTree
{-# INLINE liftIns #-}
{-# INLINE interpretFreer #-}
{-# INLINE transformFreer #-}
instance MonadFreer Monad FreerTree where
interpretFreerK :: forall (e :: * -> *) r. (e ~> Cont r) -> FreerTree e ~> Cont r
interpretFreerK = forall (e :: * -> *) r. (e ~> Cont r) -> FreerTree e ~> Cont r
interpretTreeK
{-# INLINE interpretFreerK #-}