{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE DeriveFunctor #-}
module Lessons.Lesson13 where
import Control.Monad.Free (Free (..))
import Control.Monad.Trans.State.Strict (State, get, put, runState)
import Lessons.Lesson11 (Expr(..), eval)
import Lessons.Lesson12 (MyDomain, MyDomainAlgebra(..), calculte, restore, store)
e :: Expr
e :: Expr
e = Expr -> Expr
Neg (Expr -> Expr -> Expr
Add (Integer -> Expr
Lit Integer
5) (Expr -> Expr -> Expr
Add (Integer -> Expr
Lit Integer
4) (Integer -> Expr
Lit Integer
6)))
myProgram :: MyDomain Integer
myProgram :: MyDomain Integer
myProgram = do
Integer
r <- Expr -> MyDomain Integer
calculte Expr
e
Integer
v <- MyDomain Integer
restore
Integer -> MyDomain ()
store Integer
r
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
myProgram0 :: MyDomain Integer
myProgram0 :: MyDomain Integer
myProgram0 = Expr -> MyDomain Integer
calculte Expr
e MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
r ->
MyDomain Integer
restore MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
Integer -> MyDomain ()
store Integer
r MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
))
)
myProgram1 :: MyDomain Integer
myProgram1 :: MyDomain Integer
myProgram1 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
))
)
myProgram2 :: MyDomain Integer
myProgram2 :: MyDomain Integer
myProgram2 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(MyDomain Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall a b. (a -> b) -> MyDomainAlgebra a -> MyDomainAlgebra b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
(MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
))
(Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure)
)
myProgram3 :: MyDomain Integer
myProgram3 :: MyDomain Integer
myProgram3 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
a ->
(MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
)) (Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure Integer
a)
)
)
myProgram4 :: MyDomain Integer
myProgram4 :: MyDomain Integer
myProgram4 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
a ->
(Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure Integer
a) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
)
)
)
myProgram5 :: MyDomain Integer
myProgram5 :: MyDomain Integer
myProgram5 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
)
)
myProgram6 :: MyDomain Integer
myProgram6 :: MyDomain Integer
myProgram6 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
a -> (MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
))
) (Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure Integer
a))
)
))
myProgram7 :: MyDomain Integer
myProgram7 :: MyDomain Integer
myProgram7 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
a -> (Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure Integer
a MyDomain Integer
-> (Integer -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
))
))
)
))
myProgram8 :: MyDomain Integer
myProgram8 :: MyDomain Integer
myProgram8 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain ()) -> MyDomain ()
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure) MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
)
))
myProgram9 :: MyDomain Integer
myProgram9 :: MyDomain Integer
myProgram9 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free ((MyDomain () -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain ())
-> MyDomainAlgebra (MyDomain Integer)
forall a b. (a -> b) -> MyDomainAlgebra a -> MyDomainAlgebra b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)) (Integer -> (() -> MyDomain ()) -> MyDomainAlgebra (MyDomain ())
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r () -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure))
)
)
))
myProgram10 :: MyDomain Integer
myProgram10 :: MyDomain Integer
myProgram10 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Integer
-> (() -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r (\()
a -> (MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)) (() -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure ()
a))
)
)
)))
myProgram11 :: MyDomain Integer
myProgram11 :: MyDomain Integer
myProgram11 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Integer
-> (() -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r (\()
a -> (() -> MyDomain ()
forall (f :: * -> *) a. a -> Free f a
Pure ()
a MyDomain () -> (() -> MyDomain Integer) -> MyDomain Integer
forall a b.
Free MyDomainAlgebra a
-> (a -> Free MyDomainAlgebra b) -> Free MyDomainAlgebra b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)))
)
)
))
)
myProgram12 :: MyDomain Integer
myProgram12 :: MyDomain Integer
myProgram12 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Integer
-> (() -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r (\()
a -> ((\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
) ()
a ))
)
)
))
)
myProgram13 :: MyDomain Integer
myProgram13 :: MyDomain Integer
myProgram13 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Integer
-> (() -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r (\()
_ ->
Integer -> MyDomain Integer
forall a. a -> Free MyDomainAlgebra a
forall (m :: * -> *) a. Monad m => a -> m a
return Integer
v
)
)
)
))
)
myProgram14 :: MyDomain Integer
myProgram14 :: MyDomain Integer
myProgram14 = MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Expr
-> (Integer -> MyDomain Integer)
-> MyDomainAlgebra (MyDomain Integer)
forall next. Expr -> (Integer -> next) -> MyDomainAlgebra next
Calculate Expr
e (\Integer
r ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
(Integer -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. (Integer -> next) -> MyDomainAlgebra next
Restore (\Integer
v ->
MyDomainAlgebra (MyDomain Integer) -> MyDomain Integer
forall (f :: * -> *) a. f (Free f a) -> Free f a
Free (
Integer
-> (() -> MyDomain Integer) -> MyDomainAlgebra (MyDomain Integer)
forall next. Integer -> (() -> next) -> MyDomainAlgebra next
Store Integer
r (\()
_ ->
Integer -> MyDomain Integer
forall (f :: * -> *) a. a -> Free f a
Pure Integer
v
)
)
)
))
)