{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
module UntypedPlutusCore.Contexts where
import PlutusCore.Arity
import UntypedPlutusCore.Core (Term (..))
import UntypedPlutusCore.Core.Instance.Eq ()
data AppCtx name uni fun a
= AppCtxTerm a (Term name uni fun a) (AppCtx name uni fun a)
| AppCtxType a (AppCtx name uni fun a)
| AppCtxEnd
splitAppCtx :: Term nam uni fun a -> (Term nam uni fun a, AppCtx nam uni fun a)
splitAppCtx :: forall nam (uni :: * -> *) fun a.
Term nam uni fun a -> (Term nam uni fun a, AppCtx nam uni fun a)
splitAppCtx = AppCtx nam uni fun a
-> Term nam uni fun a -> (Term nam uni fun a, AppCtx nam uni fun a)
forall {name} {uni :: * -> *} {fun} {a}.
AppCtx name uni fun a
-> Term name uni fun a
-> (Term name uni fun a, AppCtx name uni fun a)
go AppCtx nam uni fun a
forall name (uni :: * -> *) fun a. AppCtx name uni fun a
AppCtxEnd
where
go :: AppCtx name uni fun a
-> Term name uni fun a
-> (Term name uni fun a, AppCtx name uni fun a)
go AppCtx name uni fun a
appCtx = \case
Apply a
ann Term name uni fun a
function Term name uni fun a
arg -> AppCtx name uni fun a
-> Term name uni fun a
-> (Term name uni fun a, AppCtx name uni fun a)
go (a
-> Term name uni fun a
-> AppCtx name uni fun a
-> AppCtx name uni fun a
forall name (uni :: * -> *) fun a.
a
-> Term name uni fun a
-> AppCtx name uni fun a
-> AppCtx name uni fun a
AppCtxTerm a
ann Term name uni fun a
arg AppCtx name uni fun a
appCtx) Term name uni fun a
function
Force a
ann Term name uni fun a
forcedTerm -> AppCtx name uni fun a
-> Term name uni fun a
-> (Term name uni fun a, AppCtx name uni fun a)
go (a -> AppCtx name uni fun a -> AppCtx name uni fun a
forall name (uni :: * -> *) fun a.
a -> AppCtx name uni fun a -> AppCtx name uni fun a
AppCtxType a
ann AppCtx name uni fun a
appCtx) Term name uni fun a
forcedTerm
Term name uni fun a
term -> (Term name uni fun a
term, AppCtx name uni fun a
appCtx)
fillAppCtx
:: Term name uni fun ann
-> AppCtx name uni fun ann
-> Term name uni fun ann
fillAppCtx :: forall name (uni :: * -> *) fun ann.
Term name uni fun ann
-> AppCtx name uni fun ann -> Term name uni fun ann
fillAppCtx Term name uni fun ann
term = \case
AppCtx name uni fun ann
AppCtxEnd -> Term name uni fun ann
term
AppCtxTerm ann
ann Term name uni fun ann
arg AppCtx name uni fun ann
ctx -> Term name uni fun ann
-> AppCtx name uni fun ann -> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
Term name uni fun ann
-> AppCtx name uni fun ann -> Term name uni fun ann
fillAppCtx (ann
-> Term name uni fun ann
-> Term name uni fun ann
-> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
ann
-> Term name uni fun ann
-> Term name uni fun ann
-> Term name uni fun ann
Apply ann
ann Term name uni fun ann
term Term name uni fun ann
arg) AppCtx name uni fun ann
ctx
AppCtxType ann
ann AppCtx name uni fun ann
ctx -> Term name uni fun ann
-> AppCtx name uni fun ann -> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
Term name uni fun ann
-> AppCtx name uni fun ann -> Term name uni fun ann
fillAppCtx (ann -> Term name uni fun ann -> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
ann -> Term name uni fun ann -> Term name uni fun ann
Force ann
ann Term name uni fun ann
term) AppCtx name uni fun ann
ctx
data Saturation = Oversaturated | Undersaturated | Saturated
saturates :: AppCtx name uni fun a -> Arity -> Maybe Saturation
saturates :: forall name (uni :: * -> *) fun a.
AppCtx name uni fun a -> Arity -> Maybe Saturation
saturates AppCtx name uni fun a
AppCtxEnd [] = Saturation -> Maybe Saturation
forall a. a -> Maybe a
Just Saturation
Saturated
saturates AppCtx name uni fun a
AppCtxEnd Arity
_ = Saturation -> Maybe Saturation
forall a. a -> Maybe a
Just Saturation
Undersaturated
saturates (AppCtxTerm a
_ Term name uni fun a
_ AppCtx name uni fun a
ctx) (Param
TermParam : Arity
arities) = AppCtx name uni fun a -> Arity -> Maybe Saturation
forall name (uni :: * -> *) fun a.
AppCtx name uni fun a -> Arity -> Maybe Saturation
saturates AppCtx name uni fun a
ctx Arity
arities
saturates (AppCtxType a
_ AppCtx name uni fun a
ctx) (Param
TypeParam : Arity
arities) = AppCtx name uni fun a -> Arity -> Maybe Saturation
forall name (uni :: * -> *) fun a.
AppCtx name uni fun a -> Arity -> Maybe Saturation
saturates AppCtx name uni fun a
ctx Arity
arities
saturates (AppCtxTerm {}) (Param
TypeParam : Arity
_) = Maybe Saturation
forall a. Maybe a
Nothing
saturates (AppCtxType {}) (Param
TermParam : Arity
_) = Maybe Saturation
forall a. Maybe a
Nothing
saturates (AppCtxTerm {}) [] = Saturation -> Maybe Saturation
forall a. a -> Maybe a
Just Saturation
Oversaturated
saturates (AppCtxType {}) [] = Saturation -> Maybe Saturation
forall a. a -> Maybe a
Just Saturation
Oversaturated