Safe Haskell | Safe-Inferred |
---|---|
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, KnownList 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 = WrappedLambda (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
:: 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 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, 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 #