{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeApplications #-}
module PlutusCore.Arity where
import Data.Proxy
import PlutusCore
import PlutusCore.Builtin
import Prettyprinter
data Param =
TermParam | TypeParam
deriving stock (Int -> Param -> ShowS
[Param] -> ShowS
Param -> String
(Int -> Param -> ShowS)
-> (Param -> String) -> ([Param] -> ShowS) -> Show Param
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Param -> ShowS
showsPrec :: Int -> Param -> ShowS
$cshow :: Param -> String
show :: Param -> String
$cshowList :: [Param] -> ShowS
showList :: [Param] -> ShowS
Show, Param -> Param -> Bool
(Param -> Param -> Bool) -> (Param -> Param -> Bool) -> Eq Param
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Param -> Param -> Bool
== :: Param -> Param -> Bool
$c/= :: Param -> Param -> Bool
/= :: Param -> Param -> Bool
Eq)
instance Pretty Param where
pretty :: forall ann. Param -> Doc ann
pretty = Param -> Doc ann
forall a ann. Show a => a -> Doc ann
viaShow
type Arity = [Param]
typeSchemeArity :: TypeScheme val args res -> Arity
typeSchemeArity :: forall val (args :: [*]) res. TypeScheme val args res -> [Param]
typeSchemeArity TypeSchemeResult{} = []
typeSchemeArity (TypeSchemeArrow TypeScheme val args1 res
sch) = Param
TermParam Param -> [Param] -> [Param]
forall a. a -> [a] -> [a]
: TypeScheme val args1 res -> [Param]
forall val (args :: [*]) res. TypeScheme val args res -> [Param]
typeSchemeArity TypeScheme val args1 res
sch
typeSchemeArity (TypeSchemeAll Proxy '(text, uniq, kind)
_ TypeScheme val args res
sch) = Param
TypeParam Param -> [Param] -> [Param]
forall a. a -> [a] -> [a]
: TypeScheme val args res -> [Param]
forall val (args :: [*]) res. TypeScheme val args res -> [Param]
typeSchemeArity TypeScheme val args res
sch
builtinArity
:: forall uni fun
. ToBuiltinMeaning uni fun
=> Proxy uni
-> BuiltinSemanticsVariant fun
-> fun
-> Arity
builtinArity :: forall (uni :: * -> *) fun.
ToBuiltinMeaning uni fun =>
Proxy uni -> BuiltinSemanticsVariant fun -> fun -> [Param]
builtinArity Proxy uni
_ BuiltinSemanticsVariant fun
semvar fun
fun =
case forall (uni :: * -> *) fun val.
(ToBuiltinMeaning uni fun, HasMeaningIn uni val) =>
BuiltinSemanticsVariant fun
-> fun -> BuiltinMeaning val (CostingPart uni fun)
toBuiltinMeaning @uni @fun @(Term TyName Name uni fun ()) BuiltinSemanticsVariant fun
semvar fun
fun of
BuiltinMeaning TypeScheme (Term TyName Name uni fun ()) args res
sch FoldArgs args res
_ CostingPart uni fun -> BuiltinRuntime (Term TyName Name uni fun ())
_ -> TypeScheme (Term TyName Name uni fun ()) args res -> [Param]
forall val (args :: [*]) res. TypeScheme val args res -> [Param]
typeSchemeArity TypeScheme (Term TyName Name uni fun ()) args res
sch