indigo-0.6.0: Convenient imperative eDSL over Lorentz.
Safe HaskellSafe-Inferred
LanguageHaskell2010

Indigo.Backend.Lambda

Description

This module implements the ability to put Indigo computations on the stack as a lambda and execute them.

Synopsis

Documentation

data LambdaKind st arg res extra where Source #

Describes kind of lambda: pure, modifying storage, effectfull

Constructors

PureLambda :: (ExecuteLambdaPure1C arg res, CreateLambda1CGeneric '[] arg res, Typeable res) => LambdaKind st arg res '[] 
StorageLambda :: (ExecuteLambda1C st arg res, CreateLambda1CGeneric '[st] arg res, Typeable res) => Proxy st -> LambdaKind st arg res '[st] 
EffLambda :: (ExecuteLambdaEff1C st arg res, CreateLambda1CGeneric '[st, Ops] arg res, Typeable res) => Proxy st -> LambdaKind st arg res '[st, Ops] 

withLambdaKind :: LambdaKind st arg res extra -> ((ScopeCodeGen res, KnownValue arg, Typeable res, CreateLambda1CGeneric extra arg res) => r) -> r Source #

Provide common constraints that are presented in all constructors of LambdaKind

executeLambda1 Source #

Arguments

:: forall res st arg extra inp. LambdaKind st arg res extra

Kind of lambda

-> RefId

Next free variable reference

-> RetVars res

Variable that will be assigned to the resulting value

-> LambdaExecutor extra arg res inp 

Execute lambda depending on its LambdaKind

initLambdaStackVars :: LambdaKind st arg res extra -> Var arg -> StackVars (arg ': extra) Source #

Create initial stack vars depending on LambdaKind

Functionality for Frontend

type ExecuteLambdaPure1C arg res = ExecuteLambda1CGeneric '[] arg res Source #

type CreateLambda1C st arg res = (KnownValue st, CreateLambda1CGeneric '[st] arg res) Source #

type ExecuteLambda1C st arg res = (IsObject st, HasStorage st, ExecuteLambda1CGeneric '[st] arg res) Source #

type CreateLambdaEff1C st arg res = (KnownValue st, CreateLambda1CGeneric '[st, Ops] arg res) Source #

type ExecuteLambdaEff1C st arg res = (HasStorage st, HasSideEffects, IsObject st, ExecuteLambda1CGeneric '[st, Ops] arg res) Source #

Functionality for Sequential

type CreateLambda1CGeneric extra arg res = (ScopeCodeGen res, KnownValue arg, Typeable extra, KnownList extra, ZipInstr (arg ': extra), KnownValue (ZippedStack (arg ': extra)), KnownValue (ZippedStack (RetOutStack res ++ extra)), ZipInstr (RetOutStack res ++ extra), Typeable (RetOutStack res ++ extra)) Source #

createLambda1Generic :: forall arg res extra inp. CreateLambda1CGeneric extra arg res => Var (Lambda1Generic extra arg res) -> res -> StackVars (arg ': extra) -> SomeIndigoState (arg ': extra) -> IndigoState inp (Lambda1Generic extra arg res ': inp) Source #

Create a lambda, that takes only one argument, from the given computation, and return a variable referring to this lambda.

type Lambda1Generic extra arg res = WrappedLambda (arg ': extra) (RetOutStack res ++ extra) Source #