module Indigo.Frontend.Program
( IndigoM (..)
, Program (..)
, interpretProgram
, IndigoContract
) where
import Control.Monad (liftM)
import Indigo.Common.Var (HasSideEffects, HasStorage, Var)
import Indigo.Frontend.Internal.Statement
import Indigo.Lorentz (IsNotInView)
import Indigo.Prelude
data Program instr a where
Done :: a -> Program instr a
Instr :: instr a -> Program instr a
Bind :: Program instr a -> (a -> Program instr b) -> Program instr b
instance Functor (Program instr) where
fmap :: forall a b. (a -> b) -> Program instr a -> Program instr b
fmap = (a -> b) -> Program instr a -> Program instr b
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM
instance Applicative (Program instr) where
pure :: forall a. a -> Program instr a
pure = a -> Program instr a
forall a (instr :: * -> *). a -> Program instr a
Done
<*> :: forall a b.
Program instr (a -> b) -> Program instr a -> Program instr b
(<*>) = Program instr (a -> b) -> Program instr a -> Program instr b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
instance Monad (Program instr) where
return :: forall a. a -> Program instr a
return = a -> Program instr a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
>>= :: forall a b.
Program instr a -> (a -> Program instr b) -> Program instr b
(>>=) = Program instr a -> (a -> Program instr b) -> Program instr b
forall (instr :: * -> *) a b.
Program instr a -> (a -> Program instr b) -> Program instr b
Bind
interpretProgram
:: Monad m
=> (forall x . instr x -> m x)
-> Program instr a -> m a
interpretProgram :: forall (m :: * -> *) (instr :: * -> *) a.
Monad m =>
(forall x. instr x -> m x) -> Program instr a -> m a
interpretProgram forall x. instr x -> m x
_ (Done a
a) = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
interpretProgram forall x. instr x -> m x
interp (Instr instr a
a) = instr a -> m a
forall x. instr x -> m x
interp instr a
a
interpretProgram forall x. instr x -> m x
interp (Bind Program instr a
instr a -> Program instr a
rest) =
(forall x. instr x -> m x) -> Program instr a -> m a
forall (m :: * -> *) (instr :: * -> *) a.
Monad m =>
(forall x. instr x -> m x) -> Program instr a -> m a
interpretProgram forall x. instr x -> m x
interp Program instr a
instr m a -> (a -> m a) -> m a
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ((forall x. instr x -> m x) -> Program instr a -> m a
forall (m :: * -> *) (instr :: * -> *) a.
Monad m =>
(forall x. instr x -> m x) -> Program instr a -> m a
interpretProgram forall x. instr x -> m x
interp (Program instr a -> m a) -> (a -> Program instr a) -> a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Program instr a
rest)
newtype IndigoM a = IndigoM {forall a. IndigoM a -> Program (StatementF IndigoM) a
unIndigoM :: Program (StatementF IndigoM) a}
deriving stock ((forall a b. (a -> b) -> IndigoM a -> IndigoM b)
-> (forall a b. a -> IndigoM b -> IndigoM a) -> Functor IndigoM
forall a b. a -> IndigoM b -> IndigoM a
forall a b. (a -> b) -> IndigoM a -> IndigoM b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> IndigoM b -> IndigoM a
$c<$ :: forall a b. a -> IndigoM b -> IndigoM a
fmap :: forall a b. (a -> b) -> IndigoM a -> IndigoM b
$cfmap :: forall a b. (a -> b) -> IndigoM a -> IndigoM b
Functor)
deriving newtype (Functor IndigoM
Functor IndigoM
-> (forall a. a -> IndigoM a)
-> (forall a b. IndigoM (a -> b) -> IndigoM a -> IndigoM b)
-> (forall a b c.
(a -> b -> c) -> IndigoM a -> IndigoM b -> IndigoM c)
-> (forall a b. IndigoM a -> IndigoM b -> IndigoM b)
-> (forall a b. IndigoM a -> IndigoM b -> IndigoM a)
-> Applicative IndigoM
forall a. a -> IndigoM a
forall a b. IndigoM a -> IndigoM b -> IndigoM a
forall a b. IndigoM a -> IndigoM b -> IndigoM b
forall a b. IndigoM (a -> b) -> IndigoM a -> IndigoM b
forall a b c. (a -> b -> c) -> IndigoM a -> IndigoM b -> IndigoM 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 a b. IndigoM a -> IndigoM b -> IndigoM a
$c<* :: forall a b. IndigoM a -> IndigoM b -> IndigoM a
*> :: forall a b. IndigoM a -> IndigoM b -> IndigoM b
$c*> :: forall a b. IndigoM a -> IndigoM b -> IndigoM b
liftA2 :: forall a b c. (a -> b -> c) -> IndigoM a -> IndigoM b -> IndigoM c
$cliftA2 :: forall a b c. (a -> b -> c) -> IndigoM a -> IndigoM b -> IndigoM c
<*> :: forall a b. IndigoM (a -> b) -> IndigoM a -> IndigoM b
$c<*> :: forall a b. IndigoM (a -> b) -> IndigoM a -> IndigoM b
pure :: forall a. a -> IndigoM a
$cpure :: forall a. a -> IndigoM a
Applicative, Applicative IndigoM
Applicative IndigoM
-> (forall a b. IndigoM a -> (a -> IndigoM b) -> IndigoM b)
-> (forall a b. IndigoM a -> IndigoM b -> IndigoM b)
-> (forall a. a -> IndigoM a)
-> Monad IndigoM
forall a. a -> IndigoM a
forall a b. IndigoM a -> IndigoM b -> IndigoM b
forall a b. IndigoM a -> (a -> IndigoM b) -> IndigoM 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
return :: forall a. a -> IndigoM a
$creturn :: forall a. a -> IndigoM a
>> :: forall a b. IndigoM a -> IndigoM b -> IndigoM b
$c>> :: forall a b. IndigoM a -> IndigoM b -> IndigoM b
>>= :: forall a b. IndigoM a -> (a -> IndigoM b) -> IndigoM b
$c>>= :: forall a b. IndigoM a -> (a -> IndigoM b) -> IndigoM b
Monad)
type IndigoContract param st =
(HasStorage st, HasSideEffects, IsNotInView) => Var param -> IndigoM ()