{-# LANGUAGE DerivingVia #-}

-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.

{- |
Copyright   :  (c) 2023 Yamada Ryo
License     :  MPL-2.0 (see the file LICENSE)
Maintainer  :  ymdfield@outlook.jp
Stability   :  experimental
Portability :  portable

A tree-structured encoded Freer transformer.
-}
module Control.Monad.Trans.Freer.Tree where

import Control.Applicative (Alternative)
import Control.Effect.Class (type (~>))
import Control.Freer (Freer, interpretF, liftIns)
import Control.Monad (MonadPlus)
import Control.Monad.Base (MonadBase)
import Control.Monad.Identity (Identity, runIdentity)
import Control.Monad.Trans (MonadIO, MonadTrans)
import Control.Monad.Trans.Free (FreeF (Free, Pure), FreeT (FreeT), MonadFree, liftF)
import Data.Functor.Coyoneda (Coyoneda (Coyoneda), liftCoyoneda)

-- | A tree-structured encoded Freer transformer.
newtype FreerTreeT f m a = FreerTreeT {forall (f :: * -> *) (m :: * -> *) a.
FreerTreeT f m a -> FreeT (Coyoneda f) m a
unFreerTreeT :: FreeT (Coyoneda f) m a}
    deriving newtype
        ( forall a b. a -> FreerTreeT f m b -> FreerTreeT f m a
forall a b. (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (f :: * -> *) (m :: * -> *) a b.
Functor m =>
a -> FreerTreeT f m b -> FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a b.
Functor m =>
(a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
<$ :: forall a b. a -> FreerTreeT f m b -> FreerTreeT f m a
$c<$ :: forall (f :: * -> *) (m :: * -> *) a b.
Functor m =>
a -> FreerTreeT f m b -> FreerTreeT f m a
fmap :: forall a b. (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
$cfmap :: forall (f :: * -> *) (m :: * -> *) a b.
Functor m =>
(a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
Functor
        , forall a. a -> FreerTreeT f m a
forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m a
forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
forall a b.
FreerTreeT f m (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
forall a b c.
(a -> b -> c)
-> FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m c
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 :: * -> *} {m :: * -> *}.
Monad m =>
Functor (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
a -> FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
forall (f :: * -> *) (m :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m c
<* :: forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m a
$c<* :: forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m a
*> :: forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
$c*> :: forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
liftA2 :: forall a b c.
(a -> b -> c)
-> FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m c
$cliftA2 :: forall (f :: * -> *) (m :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m c
<*> :: forall a b.
FreerTreeT f m (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
$c<*> :: forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m (a -> b) -> FreerTreeT f m a -> FreerTreeT f m b
pure :: forall a. a -> FreerTreeT f m a
$cpure :: forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
a -> FreerTreeT f m a
Applicative
        , forall a. a -> FreerTreeT f m a
forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
forall a b.
FreerTreeT f m a -> (a -> FreerTreeT f m b) -> FreerTreeT f m b
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 :: * -> *) (m :: * -> *).
Monad m =>
Applicative (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
a -> FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> (a -> FreerTreeT f m b) -> FreerTreeT f m b
return :: forall a. a -> FreerTreeT f m a
$creturn :: forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
a -> FreerTreeT f m a
>> :: forall a b.
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
$c>> :: forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> FreerTreeT f m b -> FreerTreeT f m b
>>= :: forall a b.
FreerTreeT f m a -> (a -> FreerTreeT f m b) -> FreerTreeT f m b
$c>>= :: forall (f :: * -> *) (m :: * -> *) a b.
Monad m =>
FreerTreeT f m a -> (a -> FreerTreeT f m b) -> FreerTreeT f m b
Monad
        , forall a. FreerTreeT f m a
forall a. FreerTreeT f m a -> FreerTreeT f m [a]
forall a. FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m 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 :: * -> *} {m :: * -> *}.
MonadPlus m =>
Applicative (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m [a]
forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
many :: forall a. FreerTreeT f m a -> FreerTreeT f m [a]
$cmany :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m [a]
some :: forall a. FreerTreeT f m a -> FreerTreeT f m [a]
$csome :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m [a]
<|> :: forall a. FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
$c<|> :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
empty :: forall a. FreerTreeT f m a
$cempty :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a
Alternative
        , forall a. FreerTreeT f m a
forall a. FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
forall {f :: * -> *} {m :: * -> *}.
MonadPlus m =>
Monad (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *).
MonadPlus m =>
Alternative (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
mplus :: forall a. FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
$cmplus :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
mzero :: forall a. FreerTreeT f m a
$cmzero :: forall (f :: * -> *) (m :: * -> *) a.
MonadPlus m =>
FreerTreeT f m a
MonadPlus
        , MonadBase b
        , forall a. IO a -> FreerTreeT f m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall {f :: * -> *} {m :: * -> *}.
MonadIO m =>
Monad (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
MonadIO m =>
IO a -> FreerTreeT f m a
liftIO :: forall a. IO a -> FreerTreeT f m a
$cliftIO :: forall (f :: * -> *) (m :: * -> *) a.
MonadIO m =>
IO a -> FreerTreeT f m a
MonadIO
        , forall a. String -> FreerTreeT f m a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
forall {f :: * -> *} {m :: * -> *}.
MonadFail m =>
Monad (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) a.
MonadFail m =>
String -> FreerTreeT f m a
fail :: forall a. String -> FreerTreeT f m a
$cfail :: forall (f :: * -> *) (m :: * -> *) a.
MonadFail m =>
String -> FreerTreeT f m a
MonadFail
        , FreerTreeT f m a -> FreerTreeT f m a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (f :: * -> *) (m :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
/= :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c/= :: forall (f :: * -> *) (m :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
== :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c== :: forall (f :: * -> *) (m :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
Eq
        , FreerTreeT f m a -> FreerTreeT f m a -> Bool
FreerTreeT f m a -> FreerTreeT f m a -> Ordering
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m 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 :: * -> *} {m :: * -> *} {a}.
(Ord1 f, Ord1 m, Ord a) =>
Eq (FreerTreeT f m a)
forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Ordering
forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
min :: FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
$cmin :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
max :: FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
$cmax :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> FreerTreeT f m a
>= :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c>= :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
> :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c> :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
<= :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c<= :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
< :: FreerTreeT f m a -> FreerTreeT f m a -> Bool
$c< :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Bool
compare :: FreerTreeT f m a -> FreerTreeT f m a -> Ordering
$ccompare :: forall (f :: * -> *) (m :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeT f m a -> FreerTreeT f m a -> Ordering
Ord
        , ReadPrec [FreerTreeT f m a]
ReadPrec (FreerTreeT f m a)
Int -> ReadS (FreerTreeT f m a)
ReadS [FreerTreeT f m a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec [FreerTreeT f m a]
forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec (FreerTreeT f m a)
forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
Int -> ReadS (FreerTreeT f m a)
forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadS [FreerTreeT f m a]
readListPrec :: ReadPrec [FreerTreeT f m a]
$creadListPrec :: forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec [FreerTreeT f m a]
readPrec :: ReadPrec (FreerTreeT f m a)
$creadPrec :: forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec (FreerTreeT f m a)
readList :: ReadS [FreerTreeT f m a]
$creadList :: forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadS [FreerTreeT f m a]
readsPrec :: Int -> ReadS (FreerTreeT f m a)
$creadsPrec :: forall (f :: * -> *) (m :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
Int -> ReadS (FreerTreeT f m a)
Read
        , Int -> FreerTreeT f m a -> ShowS
[FreerTreeT f m a] -> ShowS
FreerTreeT f m a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
Int -> FreerTreeT f m a -> ShowS
forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
[FreerTreeT f m a] -> ShowS
forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
FreerTreeT f m a -> String
showList :: [FreerTreeT f m a] -> ShowS
$cshowList :: forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
[FreerTreeT f m a] -> ShowS
show :: FreerTreeT f m a -> String
$cshow :: forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
FreerTreeT f m a -> String
showsPrec :: Int -> FreerTreeT f m a -> ShowS
$cshowsPrec :: forall (f :: * -> *) (m :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
Int -> FreerTreeT f m a -> ShowS
Show
        , forall (m :: * -> *) a. Monad m => m a -> FreerTreeT f m a
forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
m a -> FreerTreeT f m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: forall (m :: * -> *) a. Monad m => m a -> FreerTreeT f m a
$clift :: forall (f :: * -> *) (m :: * -> *) a.
Monad m =>
m a -> FreerTreeT f m a
MonadTrans
        )
    deriving stock (forall a. FreerTreeT f m a -> Bool
forall m a. Monoid m => (a -> m) -> FreerTreeT f m a -> m
forall a b. (a -> b -> b) -> b -> FreerTreeT f m 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
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Eq a) =>
a -> FreerTreeT f m a -> Bool
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeT f m a -> a
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeT f m a -> a
forall (f :: * -> *) (m :: * -> *) m.
(Foldable m, Foldable f, Monoid m) =>
FreerTreeT f m m -> m
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> Bool
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> Int
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> [a]
forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeT f m a -> a
forall (f :: * -> *) (m :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeT f m a -> m
forall (f :: * -> *) (m :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeT f m a -> b
forall (f :: * -> *) (m :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeT f m a -> b
product :: forall a. Num a => FreerTreeT f m a -> a
$cproduct :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeT f m a -> a
sum :: forall a. Num a => FreerTreeT f m a -> a
$csum :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeT f m a -> a
minimum :: forall a. Ord a => FreerTreeT f m a -> a
$cminimum :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeT f m a -> a
maximum :: forall a. Ord a => FreerTreeT f m a -> a
$cmaximum :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeT f m a -> a
elem :: forall a. Eq a => a -> FreerTreeT f m a -> Bool
$celem :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f, Eq a) =>
a -> FreerTreeT f m a -> Bool
length :: forall a. FreerTreeT f m a -> Int
$clength :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> Int
null :: forall a. FreerTreeT f m a -> Bool
$cnull :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> Bool
toList :: forall a. FreerTreeT f m a -> [a]
$ctoList :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeT f m a -> [a]
foldl1 :: forall a. (a -> a -> a) -> FreerTreeT f m a -> a
$cfoldl1 :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeT f m a -> a
foldr1 :: forall a. (a -> a -> a) -> FreerTreeT f m a -> a
$cfoldr1 :: forall (f :: * -> *) (m :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeT f m a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> FreerTreeT f m a -> b
$cfoldl' :: forall (f :: * -> *) (m :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeT f m a -> b
foldl :: forall b a. (b -> a -> b) -> b -> FreerTreeT f m a -> b
$cfoldl :: forall (f :: * -> *) (m :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeT f m a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> FreerTreeT f m a -> b
$cfoldr' :: forall (f :: * -> *) (m :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeT f m a -> b
foldr :: forall a b. (a -> b -> b) -> b -> FreerTreeT f m a -> b
$cfoldr :: forall (f :: * -> *) (m :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeT f m a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> FreerTreeT f m a -> m
$cfoldMap' :: forall (f :: * -> *) (m :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeT f m a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> FreerTreeT f m a -> m
$cfoldMap :: forall (f :: * -> *) (m :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeT f m a -> m
fold :: forall m. Monoid m => FreerTreeT f m m -> m
$cfold :: forall (f :: * -> *) (m :: * -> *) m.
(Foldable m, Foldable f, Monoid m) =>
FreerTreeT f m 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 :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTreeT f m a -> f (FreerTreeT f m b)
forall {f :: * -> *} {m :: * -> *}.
(Monad m, Traversable m, Traversable f) =>
Functor (FreerTreeT f m)
forall {f :: * -> *} {m :: * -> *}.
(Monad m, Traversable m, Traversable f) =>
Foldable (FreerTreeT f m)
forall (f :: * -> *) (m :: * -> *) (m :: * -> *) a.
(Monad m, Traversable m, Traversable f, Monad m) =>
FreerTreeT f m (m a) -> m (FreerTreeT f m a)
forall (f :: * -> *) (m :: * -> *) (f :: * -> *) a.
(Monad m, Traversable m, Traversable f, Applicative f) =>
FreerTreeT f m (f a) -> f (FreerTreeT f m a)
forall (f :: * -> *) (m :: * -> *) (m :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Monad m) =>
(a -> m b) -> FreerTreeT f m a -> m (FreerTreeT f m b)
forall (f :: * -> *) (m :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Applicative f) =>
(a -> f b) -> FreerTreeT f m a -> f (FreerTreeT f m b)
sequence :: forall (m :: * -> *) a.
Monad m =>
FreerTreeT f m (m a) -> m (FreerTreeT f m a)
$csequence :: forall (f :: * -> *) (m :: * -> *) (m :: * -> *) a.
(Monad m, Traversable m, Traversable f, Monad m) =>
FreerTreeT f m (m a) -> m (FreerTreeT f m a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FreerTreeT f m a -> m (FreerTreeT f m b)
$cmapM :: forall (f :: * -> *) (m :: * -> *) (m :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Monad m) =>
(a -> m b) -> FreerTreeT f m a -> m (FreerTreeT f m b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
FreerTreeT f m (f a) -> f (FreerTreeT f m a)
$csequenceA :: forall (f :: * -> *) (m :: * -> *) (f :: * -> *) a.
(Monad m, Traversable m, Traversable f, Applicative f) =>
FreerTreeT f m (f a) -> f (FreerTreeT f m a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTreeT f m a -> f (FreerTreeT f m b)
$ctraverse :: forall (f :: * -> *) (m :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Applicative f) =>
(a -> f b) -> FreerTreeT f m a -> f (FreerTreeT f m b)
Traversable)

newtype FreerTreeMonad m f a = FreerTreeMonad {forall (m :: * -> *) (f :: * -> *) a.
FreerTreeMonad m f a -> FreerTreeT f m a
unFreerTreeMonad :: FreerTreeT f m a}
    deriving newtype
        ( forall a b. a -> FreerTreeMonad m f b -> FreerTreeMonad m f a
forall a b.
(a -> b) -> FreerTreeMonad m f a -> FreerTreeMonad m f b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (m :: * -> *) (f :: * -> *) a b.
Functor m =>
a -> FreerTreeMonad m f b -> FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a b.
Functor m =>
(a -> b) -> FreerTreeMonad m f a -> FreerTreeMonad m f b
<$ :: forall a b. a -> FreerTreeMonad m f b -> FreerTreeMonad m f a
$c<$ :: forall (m :: * -> *) (f :: * -> *) a b.
Functor m =>
a -> FreerTreeMonad m f b -> FreerTreeMonad m f a
fmap :: forall a b.
(a -> b) -> FreerTreeMonad m f a -> FreerTreeMonad m f b
$cfmap :: forall (m :: * -> *) (f :: * -> *) a b.
Functor m =>
(a -> b) -> FreerTreeMonad m f a -> FreerTreeMonad m f b
Functor
        , forall a. a -> FreerTreeMonad m f a
forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f a
forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
forall a b.
FreerTreeMonad m f (a -> b)
-> FreerTreeMonad m f a -> FreerTreeMonad m f b
forall a b c.
(a -> b -> c)
-> FreerTreeMonad m f a
-> FreerTreeMonad m f b
-> FreerTreeMonad m f c
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 {m :: * -> *} {f :: * -> *}.
Monad m =>
Functor (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
a -> FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f (a -> b)
-> FreerTreeMonad m f a -> FreerTreeMonad m f b
forall (m :: * -> *) (f :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> FreerTreeMonad m f a
-> FreerTreeMonad m f b
-> FreerTreeMonad m f c
<* :: forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f a
$c<* :: forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f a
*> :: forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
$c*> :: forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
liftA2 :: forall a b c.
(a -> b -> c)
-> FreerTreeMonad m f a
-> FreerTreeMonad m f b
-> FreerTreeMonad m f c
$cliftA2 :: forall (m :: * -> *) (f :: * -> *) a b c.
Monad m =>
(a -> b -> c)
-> FreerTreeMonad m f a
-> FreerTreeMonad m f b
-> FreerTreeMonad m f c
<*> :: forall a b.
FreerTreeMonad m f (a -> b)
-> FreerTreeMonad m f a -> FreerTreeMonad m f b
$c<*> :: forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f (a -> b)
-> FreerTreeMonad m f a -> FreerTreeMonad m f b
pure :: forall a. a -> FreerTreeMonad m f a
$cpure :: forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
a -> FreerTreeMonad m f a
Applicative
        , forall a. FreerTreeMonad m f a
forall a. FreerTreeMonad m f a -> FreerTreeMonad m f [a]
forall a.
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m 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 {m :: * -> *} {f :: * -> *}.
MonadPlus m =>
Applicative (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a -> FreerTreeMonad m f [a]
forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
many :: forall a. FreerTreeMonad m f a -> FreerTreeMonad m f [a]
$cmany :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a -> FreerTreeMonad m f [a]
some :: forall a. FreerTreeMonad m f a -> FreerTreeMonad m f [a]
$csome :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a -> FreerTreeMonad m f [a]
<|> :: forall a.
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
$c<|> :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
empty :: forall a. FreerTreeMonad m f a
$cempty :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
Alternative
        , forall a. a -> FreerTreeMonad m f a
forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
forall a b.
FreerTreeMonad m f a
-> (a -> FreerTreeMonad m f b) -> FreerTreeMonad m f b
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 (m :: * -> *) (f :: * -> *).
Monad m =>
Applicative (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
a -> FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> (a -> FreerTreeMonad m f b) -> FreerTreeMonad m f b
return :: forall a. a -> FreerTreeMonad m f a
$creturn :: forall (m :: * -> *) (f :: * -> *) a.
Monad m =>
a -> FreerTreeMonad m f a
>> :: forall a b.
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
$c>> :: forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f b -> FreerTreeMonad m f b
>>= :: forall a b.
FreerTreeMonad m f a
-> (a -> FreerTreeMonad m f b) -> FreerTreeMonad m f b
$c>>= :: forall (m :: * -> *) (f :: * -> *) a b.
Monad m =>
FreerTreeMonad m f a
-> (a -> FreerTreeMonad m f b) -> FreerTreeMonad m f b
Monad
        , forall a. FreerTreeMonad m f a
forall a.
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
forall (m :: * -> *).
Alternative m
-> Monad m
-> (forall a. m a)
-> (forall a. m a -> m a -> m a)
-> MonadPlus m
forall {m :: * -> *} {f :: * -> *}.
MonadPlus m =>
Monad (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *).
MonadPlus m =>
Alternative (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
mplus :: forall a.
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
$cmplus :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
mzero :: forall a. FreerTreeMonad m f a
$cmzero :: forall (m :: * -> *) (f :: * -> *) a.
MonadPlus m =>
FreerTreeMonad m f a
MonadPlus
        , MonadBase b
        , forall a. IO a -> FreerTreeMonad m f a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall {m :: * -> *} {f :: * -> *}.
MonadIO m =>
Monad (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
MonadIO m =>
IO a -> FreerTreeMonad m f a
liftIO :: forall a. IO a -> FreerTreeMonad m f a
$cliftIO :: forall (m :: * -> *) (f :: * -> *) a.
MonadIO m =>
IO a -> FreerTreeMonad m f a
MonadIO
        , forall a. String -> FreerTreeMonad m f a
forall (m :: * -> *).
Monad m -> (forall a. String -> m a) -> MonadFail m
forall {m :: * -> *} {f :: * -> *}.
MonadFail m =>
Monad (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) a.
MonadFail m =>
String -> FreerTreeMonad m f a
fail :: forall a. String -> FreerTreeMonad m f a
$cfail :: forall (m :: * -> *) (f :: * -> *) a.
MonadFail m =>
String -> FreerTreeMonad m f a
MonadFail
        , FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall (m :: * -> *) (f :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
/= :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c/= :: forall (m :: * -> *) (f :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
== :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c== :: forall (m :: * -> *) (f :: * -> *) a.
(Eq1 f, Eq1 m, Eq a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
Eq
        , FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Ordering
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m 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 {m :: * -> *} {f :: * -> *} {a}.
(Ord1 f, Ord1 m, Ord a) =>
Eq (FreerTreeMonad m f a)
forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Ordering
forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
min :: FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
$cmin :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
max :: FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
$cmax :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a
-> FreerTreeMonad m f a -> FreerTreeMonad m f a
>= :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c>= :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
> :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c> :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
<= :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c<= :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
< :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
$c< :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Bool
compare :: FreerTreeMonad m f a -> FreerTreeMonad m f a -> Ordering
$ccompare :: forall (m :: * -> *) (f :: * -> *) a.
(Ord1 f, Ord1 m, Ord a) =>
FreerTreeMonad m f a -> FreerTreeMonad m f a -> Ordering
Ord
        , ReadPrec [FreerTreeMonad m f a]
ReadPrec (FreerTreeMonad m f a)
Int -> ReadS (FreerTreeMonad m f a)
ReadS [FreerTreeMonad m f a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec [FreerTreeMonad m f a]
forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec (FreerTreeMonad m f a)
forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
Int -> ReadS (FreerTreeMonad m f a)
forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadS [FreerTreeMonad m f a]
readListPrec :: ReadPrec [FreerTreeMonad m f a]
$creadListPrec :: forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec [FreerTreeMonad m f a]
readPrec :: ReadPrec (FreerTreeMonad m f a)
$creadPrec :: forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadPrec (FreerTreeMonad m f a)
readList :: ReadS [FreerTreeMonad m f a]
$creadList :: forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
ReadS [FreerTreeMonad m f a]
readsPrec :: Int -> ReadS (FreerTreeMonad m f a)
$creadsPrec :: forall (m :: * -> *) (f :: * -> *) a.
(Read1 f, Read1 m, Read a) =>
Int -> ReadS (FreerTreeMonad m f a)
Read
        , Int -> FreerTreeMonad m f a -> ShowS
[FreerTreeMonad m f a] -> ShowS
FreerTreeMonad m f a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
Int -> FreerTreeMonad m f a -> ShowS
forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
[FreerTreeMonad m f a] -> ShowS
forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
FreerTreeMonad m f a -> String
showList :: [FreerTreeMonad m f a] -> ShowS
$cshowList :: forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
[FreerTreeMonad m f a] -> ShowS
show :: FreerTreeMonad m f a -> String
$cshow :: forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
FreerTreeMonad m f a -> String
showsPrec :: Int -> FreerTreeMonad m f a -> ShowS
$cshowsPrec :: forall (m :: * -> *) (f :: * -> *) a.
(Functor f, Show1 f, Show1 m, Show a) =>
Int -> FreerTreeMonad m f a -> ShowS
Show
        )
    deriving stock (forall a. FreerTreeMonad m f a -> Bool
forall m a. Monoid m => (a -> m) -> FreerTreeMonad m f a -> m
forall a b. (a -> b -> b) -> b -> FreerTreeMonad m 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
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Eq a) =>
a -> FreerTreeMonad m f a -> Bool
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeMonad m f a -> a
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeMonad m f a -> a
forall (m :: * -> *) (f :: * -> *) m.
(Foldable m, Foldable f, Monoid m) =>
FreerTreeMonad m f m -> m
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> Bool
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> Int
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> [a]
forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeMonad m f a -> a
forall (m :: * -> *) (f :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeMonad m f a -> m
forall (m :: * -> *) (f :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeMonad m f a -> b
forall (m :: * -> *) (f :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeMonad m f a -> b
product :: forall a. Num a => FreerTreeMonad m f a -> a
$cproduct :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeMonad m f a -> a
sum :: forall a. Num a => FreerTreeMonad m f a -> a
$csum :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Num a) =>
FreerTreeMonad m f a -> a
minimum :: forall a. Ord a => FreerTreeMonad m f a -> a
$cminimum :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeMonad m f a -> a
maximum :: forall a. Ord a => FreerTreeMonad m f a -> a
$cmaximum :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Ord a) =>
FreerTreeMonad m f a -> a
elem :: forall a. Eq a => a -> FreerTreeMonad m f a -> Bool
$celem :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f, Eq a) =>
a -> FreerTreeMonad m f a -> Bool
length :: forall a. FreerTreeMonad m f a -> Int
$clength :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> Int
null :: forall a. FreerTreeMonad m f a -> Bool
$cnull :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> Bool
toList :: forall a. FreerTreeMonad m f a -> [a]
$ctoList :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
FreerTreeMonad m f a -> [a]
foldl1 :: forall a. (a -> a -> a) -> FreerTreeMonad m f a -> a
$cfoldl1 :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeMonad m f a -> a
foldr1 :: forall a. (a -> a -> a) -> FreerTreeMonad m f a -> a
$cfoldr1 :: forall (m :: * -> *) (f :: * -> *) a.
(Foldable m, Foldable f) =>
(a -> a -> a) -> FreerTreeMonad m f a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> FreerTreeMonad m f a -> b
$cfoldl' :: forall (m :: * -> *) (f :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeMonad m f a -> b
foldl :: forall b a. (b -> a -> b) -> b -> FreerTreeMonad m f a -> b
$cfoldl :: forall (m :: * -> *) (f :: * -> *) b a.
(Foldable m, Foldable f) =>
(b -> a -> b) -> b -> FreerTreeMonad m f a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> FreerTreeMonad m f a -> b
$cfoldr' :: forall (m :: * -> *) (f :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeMonad m f a -> b
foldr :: forall a b. (a -> b -> b) -> b -> FreerTreeMonad m f a -> b
$cfoldr :: forall (m :: * -> *) (f :: * -> *) a b.
(Foldable m, Foldable f) =>
(a -> b -> b) -> b -> FreerTreeMonad m f a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> FreerTreeMonad m f a -> m
$cfoldMap' :: forall (m :: * -> *) (f :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeMonad m f a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> FreerTreeMonad m f a -> m
$cfoldMap :: forall (m :: * -> *) (f :: * -> *) m a.
(Foldable m, Foldable f, Monoid m) =>
(a -> m) -> FreerTreeMonad m f a -> m
fold :: forall m. Monoid m => FreerTreeMonad m f m -> m
$cfold :: forall (m :: * -> *) (f :: * -> *) m.
(Foldable m, Foldable f, Monoid m) =>
FreerTreeMonad m 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 :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTreeMonad m f a -> f (FreerTreeMonad m f b)
forall {m :: * -> *} {f :: * -> *}.
(Monad m, Traversable m, Traversable f) =>
Functor (FreerTreeMonad m f)
forall {m :: * -> *} {f :: * -> *}.
(Monad m, Traversable m, Traversable f) =>
Foldable (FreerTreeMonad m f)
forall (m :: * -> *) (f :: * -> *) (m :: * -> *) a.
(Monad m, Traversable m, Traversable f, Monad m) =>
FreerTreeMonad m f (m a) -> m (FreerTreeMonad m f a)
forall (m :: * -> *) (f :: * -> *) (f :: * -> *) a.
(Monad m, Traversable m, Traversable f, Applicative f) =>
FreerTreeMonad m f (f a) -> f (FreerTreeMonad m f a)
forall (m :: * -> *) (f :: * -> *) (m :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Monad m) =>
(a -> m b) -> FreerTreeMonad m f a -> m (FreerTreeMonad m f b)
forall (m :: * -> *) (f :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Applicative f) =>
(a -> f b) -> FreerTreeMonad m f a -> f (FreerTreeMonad m f b)
sequence :: forall (m :: * -> *) a.
Monad m =>
FreerTreeMonad m f (m a) -> m (FreerTreeMonad m f a)
$csequence :: forall (m :: * -> *) (f :: * -> *) (m :: * -> *) a.
(Monad m, Traversable m, Traversable f, Monad m) =>
FreerTreeMonad m f (m a) -> m (FreerTreeMonad m f a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FreerTreeMonad m f a -> m (FreerTreeMonad m f b)
$cmapM :: forall (m :: * -> *) (f :: * -> *) (m :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Monad m) =>
(a -> m b) -> FreerTreeMonad m f a -> m (FreerTreeMonad m f b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
FreerTreeMonad m f (f a) -> f (FreerTreeMonad m f a)
$csequenceA :: forall (m :: * -> *) (f :: * -> *) (f :: * -> *) a.
(Monad m, Traversable m, Traversable f, Applicative f) =>
FreerTreeMonad m f (f a) -> f (FreerTreeMonad m f a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FreerTreeMonad m f a -> f (FreerTreeMonad m f b)
$ctraverse :: forall (m :: * -> *) (f :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable m, Traversable f, Applicative f) =>
(a -> f b) -> FreerTreeMonad m f a -> f (FreerTreeMonad m f b)
Traversable)
    deriving (MonadFree (Coyoneda f)) via FreeT (Coyoneda f) m

liftInsTree :: Monad m => ins a -> FreerTreeT ins m a
liftInsTree :: forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
ins a -> FreerTreeT ins m a
liftInsTree = forall (f :: * -> *) (m :: * -> *) a.
FreeT (Coyoneda f) m a -> FreerTreeT f m a
FreerTreeT 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 #-}

interpretTTree :: Monad n => (m ~> n) -> (ins ~> n) -> FreerTreeT ins m a -> n a
interpretTTree :: forall (n :: * -> *) (m :: * -> *) (ins :: * -> *) a.
Monad n =>
(m ~> n) -> (ins ~> n) -> FreerTreeT ins m a -> n a
interpretTTree m ~> n
iLower ins ~> n
i (FreerTreeT (FreeT m (FreeF (Coyoneda ins) a (FreeT (Coyoneda ins) m a))
m)) =
    m ~> n
iLower m (FreeF (Coyoneda ins) a (FreeT (Coyoneda ins) m a))
m forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Pure a
x -> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
x
        Free (Coyoneda b -> FreeT (Coyoneda ins) m a
f ins b
e) -> ins ~> n
i ins b
e forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (n :: * -> *) (m :: * -> *) (ins :: * -> *) a.
Monad n =>
(m ~> n) -> (ins ~> n) -> FreerTreeT ins m a -> n a
interpretTTree m ~> n
iLower ins ~> n
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) (m :: * -> *) a.
FreeT (Coyoneda f) m a -> FreerTreeT f m a
FreerTreeT forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> FreeT (Coyoneda ins) m a
f

type FreerTree = FreerTreeMonad Identity

instance Freer Monad FreerTree where
    liftIns :: forall (ins :: * -> *) a. ins a -> FreerTree ins a
liftIns = forall (m :: * -> *) (f :: * -> *) a.
FreerTreeT f m a -> FreerTreeMonad m f a
FreerTreeMonad forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
ins a -> FreerTreeT ins m a
liftInsTree
    interpretF :: forall (m :: * -> *) (ins :: * -> *) a.
Monad m =>
(ins ~> m) -> FreerTree ins a -> m a
interpretF ins ~> m
i = forall (n :: * -> *) (m :: * -> *) (ins :: * -> *) a.
Monad n =>
(m ~> n) -> (ins ~> n) -> FreerTreeT ins m a -> n a
interpretTTree (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Identity a -> a
runIdentity) ins ~> m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) (f :: * -> *) a.
FreerTreeMonad m f a -> FreerTreeT f m a
unFreerTreeMonad
    {-# INLINE liftIns #-}
    {-# INLINE interpretF #-}

-- todo: MonadTransFreer instance