Safe Haskell | None |
---|---|
Language | Haskell2010 |
This module implements the ability to put Indigo computations on the stack as a lambda and execute them.
Synopsis
- data LambdaKind st arg res extra where
- 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
- executeLambda1 :: forall res st arg extra inp. LambdaKind st arg res extra -> RefId -> RetVars res -> LambdaExecutor extra arg res inp
- initLambdaStackVars :: LambdaKind st arg res extra -> Var arg -> StackVars (arg & extra)
- type CreateLambdaPure1C arg res = CreateLambda1CGeneric '[] arg res
- type ExecuteLambdaPure1C arg res = ExecuteLambda1CGeneric '[] arg res
- type CreateLambda1C st arg res = (KnownValue st, CreateLambda1CGeneric '[st] arg res)
- type ExecuteLambda1C st arg res = (IsObject st, HasStorage st, ExecuteLambda1CGeneric '[st] arg res)
- type CreateLambdaEff1C st arg res = (KnownValue st, CreateLambda1CGeneric '[st, Ops] arg res)
- type ExecuteLambdaEff1C st arg res = (HasStorage st, HasSideEffects, IsObject st, ExecuteLambda1CGeneric '[st, Ops] arg res)
- type CreateLambda1CGeneric extra arg res = (ScopeCodeGen res, KnownValue arg, Typeable extra, ZipInstr (arg & extra), KnownValue (ZippedStack (arg ': extra)), KnownValue (ZippedStack (RetOutStack res ++ extra)), ZipInstr (RetOutStack res ++ extra), Typeable (RetOutStack res ++ extra))
- 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)
- type Lambda1Generic extra arg res = (arg & extra) :-> (RetOutStack res ++ extra)
Documentation
data LambdaKind st arg res extra where Source #
Describes kind of lambda: pure, modifying storage, effectfull
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 :: forall res st arg extra inp. LambdaKind st arg res extra -> RefId -> RetVars res -> LambdaExecutor extra arg res inp Source #
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 CreateLambdaPure1C arg res = CreateLambda1CGeneric '[] arg res Source #
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, 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 = (arg & extra) :-> (RetOutStack res ++ extra) Source #