-- editorconfig-checker-disable-file
module UntypedPlutusCore.MkUPlc (UVarDecl (..), uvarDeclName, uvarDeclAnn, mkVar, mkIterLamAbs, Def(..), UTermDef) where

import PlutusCore.MkPlc (Def (..))
import UntypedPlutusCore.Core.Type

-- | A term definition as a variable.
type UTermDef name uni fun ann = Def (UVarDecl name ann) (Term name uni fun ann)

-- | Make a 'Var' referencing the given 'VarDecl'.
mkVar :: ann -> UVarDecl name ann -> Term name uni fun ann
mkVar :: forall ann name (uni :: * -> *) fun.
ann -> UVarDecl name ann -> Term name uni fun ann
mkVar ann
ann = ann -> name -> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
ann -> name -> Term name uni fun ann
Var ann
ann (name -> Term name uni fun ann)
-> (UVarDecl name ann -> name)
-> UVarDecl name ann
-> Term name uni fun ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UVarDecl name ann -> name
forall name ann. UVarDecl name ann -> name
_uvarDeclName

-- | Lambda abstract a list of names.
mkIterLamAbs
    :: [UVarDecl name ann]
    -> Term name uni fun ann
    -> Term name uni fun ann
mkIterLamAbs :: forall name ann (uni :: * -> *) fun.
[UVarDecl name ann]
-> Term name uni fun ann -> Term name uni fun ann
mkIterLamAbs [UVarDecl name ann]
args Term name uni fun ann
body =
    (UVarDecl name ann
 -> Term name uni fun ann -> Term name uni fun ann)
-> Term name uni fun ann
-> [UVarDecl name ann]
-> Term name uni fun ann
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\(UVarDecl ann
ann name
name ) Term name uni fun ann
acc -> ann -> name -> Term name uni fun ann -> Term name uni fun ann
forall name (uni :: * -> *) fun ann.
ann -> name -> Term name uni fun ann -> Term name uni fun ann
LamAbs ann
ann name
name Term name uni fun ann
acc) Term name uni fun ann
body [UVarDecl name ann]
args