module Covenant.Internal.Ledger
  ( ledgerTypes,
    -- For testing
    DeclBuilder (Decl),
    CtorBuilder (Ctor),
    mkDecl,
    maybeT,
    pair,
    list,
    tree,
    weirderList,
  )
where

import Covenant.DeBruijn (DeBruijn (Z))
import Covenant.Index (Count, count0, count1, count2, ix0, ix1)
import Covenant.Internal.Strategy
  ( DataEncoding (BuiltinStrategy, PlutusData),
    InternalStrategy (InternalAssocMapStrat, InternalDataStrat, InternalListStrat, InternalPairStrat),
    PlutusDataStrategy (ConstrData, NewtypeData),
  )
import Covenant.Internal.Type
  ( AbstractTy (BoundAt),
    BuiltinFlatT (BoolT, ByteStringT, IntegerT),
    Constructor (Constructor),
    ConstructorName (ConstructorName),
    DataDeclaration (DataDeclaration),
    TyName (TyName),
    ValT (Abstraction, BuiltinFlat, Datatype),
  )
import Data.Coerce (coerce)
import Data.Vector qualified as Vector

-- All the ledger types. Just putting them in a list for now but they'll probably end up in some other kind of container eventually
ledgerTypes :: [DataDeclaration AbstractTy]
ledgerTypes :: [DataDeclaration AbstractTy]
ledgerTypes =
  [ DataDeclaration AbstractTy
list,
    DataDeclaration AbstractTy
pair,
    DataDeclaration AbstractTy
plutusData,
    DataDeclaration AbstractTy
datum,
    DataDeclaration AbstractTy
redeemer,
    DataDeclaration AbstractTy
scriptHash,
    DataDeclaration AbstractTy
datumHash,
    DataDeclaration AbstractTy
redeemerHash,
    DataDeclaration AbstractTy
credential,
    DataDeclaration AbstractTy
stakingCredential,
    DataDeclaration AbstractTy
pubKeyHash,
    DataDeclaration AbstractTy
address,
    DataDeclaration AbstractTy
maybeT,
    DataDeclaration AbstractTy
posixTime,
    DataDeclaration AbstractTy
interval,
    DataDeclaration AbstractTy
upperBound,
    DataDeclaration AbstractTy
lowerBound,
    DataDeclaration AbstractTy
extended,
    DataDeclaration AbstractTy
ledgerBytes,
    DataDeclaration AbstractTy
assocMap,
    DataDeclaration AbstractTy
currencySymbol,
    DataDeclaration AbstractTy
tokenName,
    DataDeclaration AbstractTy
value,
    DataDeclaration AbstractTy
lovelace,
    DataDeclaration AbstractTy
rational,
    DataDeclaration AbstractTy
mintValue,
    DataDeclaration AbstractTy
txId,
    DataDeclaration AbstractTy
txOutRef,
    DataDeclaration AbstractTy
txOut,
    DataDeclaration AbstractTy
outputDatum,
    DataDeclaration AbstractTy
txInInfo,
    DataDeclaration AbstractTy
dRepCredential,
    DataDeclaration AbstractTy
dRep,
    DataDeclaration AbstractTy
delegatee,
    DataDeclaration AbstractTy
coldCommitteeCredential,
    DataDeclaration AbstractTy
hotCommitteeCredential,
    DataDeclaration AbstractTy
txCert,
    DataDeclaration AbstractTy
voter,
    DataDeclaration AbstractTy
vote,
    DataDeclaration AbstractTy
governanceActionId,
    DataDeclaration AbstractTy
committee,
    DataDeclaration AbstractTy
constitution,
    DataDeclaration AbstractTy
changedParameters,
    DataDeclaration AbstractTy
protocolVersion,
    DataDeclaration AbstractTy
governanceAction,
    DataDeclaration AbstractTy
proposalProcedure,
    DataDeclaration AbstractTy
scriptPurpose,
    DataDeclaration AbstractTy
scriptInfo,
    DataDeclaration AbstractTy
txInfo,
    DataDeclaration AbstractTy
scriptContext
  ]

-- Builtins. These aren't "real" ADTs and their unique encoding strategies indicate special handling

-- Note (Koz, 11/07/25): This has a Haddock, and is versioned, because
-- Covenant.Test exposes it. If we ever stop doing this, we can remove this
-- Haddock.

-- | The onchain list type.
--
-- @since 1.1.0
list :: DataDeclaration AbstractTy
list :: DataDeclaration AbstractTy
list =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"List"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Nil" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Cons" [AbstractTy -> ValT AbstractTy
forall a. a -> ValT a
Abstraction (DeBruijn -> Index "tyvar" -> AbstractTy
BoundAt DeBruijn
Z Index "tyvar"
forall (ofWhat :: Symbol). Index ofWhat
ix0), TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [AbstractTy -> ValT AbstractTy
forall a. a -> ValT a
Abstraction (DeBruijn -> Index "tyvar" -> AbstractTy
BoundAt DeBruijn
Z Index "tyvar"
forall (ofWhat :: Symbol). Index ofWhat
ix0)]]
      ]
      (InternalStrategy -> DataEncoding
BuiltinStrategy InternalStrategy
InternalListStrat)

pair :: DataDeclaration AbstractTy
pair :: DataDeclaration AbstractTy
pair = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"Pair" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count2 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Pair" [ValT AbstractTy
a, ValT AbstractTy
b]] (InternalStrategy -> DataEncoding
BuiltinStrategy InternalStrategy
InternalPairStrat)

-- Make sure this matches up with chooseData
plutusData :: DataDeclaration AbstractTy
plutusData :: DataDeclaration AbstractTy
plutusData =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Data"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Constr" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Pair" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" []]]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"I" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"B" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT]
      ]
      (InternalStrategy -> DataEncoding
BuiltinStrategy InternalStrategy
InternalDataStrat)

-- Newtypes and Hash Types (from V1)

datum :: DataDeclaration AbstractTy
datum :: DataDeclaration AbstractTy
datum = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"Datum" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Datum" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" []]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

redeemer :: DataDeclaration AbstractTy
redeemer :: DataDeclaration AbstractTy
redeemer = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"Redeemer" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Redeemer" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" []]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

scriptHash :: DataDeclaration AbstractTy
scriptHash :: DataDeclaration AbstractTy
scriptHash = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"ScriptHash" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"ScriptHash" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

datumHash :: DataDeclaration AbstractTy
datumHash :: DataDeclaration AbstractTy
datumHash = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"DatumHash" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DatumHash" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

redeemerHash :: DataDeclaration AbstractTy
redeemerHash :: DataDeclaration AbstractTy
redeemerHash = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"RedeemerHash" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"RedeemerHash" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

-- Credential + Staking Credential (from V1)
credential :: DataDeclaration AbstractTy
credential :: DataDeclaration AbstractTy
credential =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Credential"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"PubKeyCredential" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"ScriptCredential" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptHash" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

stakingCredential :: DataDeclaration AbstractTy
stakingCredential :: DataDeclaration AbstractTy
stakingCredential =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"StakingCredential"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"StakingHash" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"StakingPtr" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- PubKeyHash (from V1)
pubKeyHash :: DataDeclaration AbstractTy
pubKeyHash :: DataDeclaration AbstractTy
pubKeyHash = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
"PubKeyHash" Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"PubKeyHash" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

-- Address (from V1)
address :: DataDeclaration AbstractTy
address :: DataDeclaration AbstractTy
address =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Address"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Address" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"StakingCredential" []]]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- PlutusTX types, from https://github.com/IntersectMBO/plutus/blob/master/plutus-tx/src/PlutusTx/IsData/Instances.hs
maybeT :: DataDeclaration AbstractTy
maybeT :: DataDeclaration AbstractTy
maybeT =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Maybe"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Just" [AbstractTy -> ValT AbstractTy
forall a. a -> ValT a
Abstraction (DeBruijn -> Index "tyvar" -> AbstractTy
BoundAt DeBruijn
Z Index "tyvar"
forall (ofWhat :: Symbol). Index ofWhat
ix0)],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Nothing" []
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- Time & Intervals (V1)

posixTime :: DataDeclaration AbstractTy
posixTime :: DataDeclaration AbstractTy
posixTime = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"POSIXTime" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT)

interval :: DataDeclaration AbstractTy
interval :: DataDeclaration AbstractTy
interval =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Interval"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"Interval"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"LowerBound" [ValT AbstractTy
a],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"UpperBound" [ValT AbstractTy
a]
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

upperBound :: DataDeclaration AbstractTy
upperBound :: DataDeclaration AbstractTy
upperBound =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"UpperBound"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"UpperBound" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Extended" [ValT AbstractTy
a], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
BoolT]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

lowerBound :: DataDeclaration AbstractTy
lowerBound :: DataDeclaration AbstractTy
lowerBound =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"LowerBound"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"LowerBound" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Extended" [ValT AbstractTy
a], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
BoolT]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

extended :: DataDeclaration AbstractTy
extended :: DataDeclaration AbstractTy
extended =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Extended"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"NegInf" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Finite" [ValT AbstractTy
a],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"PosInf" []
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- LedgerBytes (V1)

ledgerBytes :: DataDeclaration AbstractTy
ledgerBytes :: DataDeclaration AbstractTy
ledgerBytes = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"LedgerBytes" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT)

-- Value & Friends (should be V1). Also AssocMap (v1)

-- NOTE Sean 5/28: This is "magical" like List/Pair/Data due to the fact that we cannot use an opaque
--                 (because opaques do not take type parameters)
assocMap :: DataDeclaration AbstractTy
assocMap :: DataDeclaration AbstractTy
assocMap =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Map"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count2
      [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Pair" [ValT AbstractTy
a, ValT AbstractTy
b]]]]
      (InternalStrategy -> DataEncoding
BuiltinStrategy InternalStrategy
InternalAssocMapStrat)

currencySymbol :: DataDeclaration AbstractTy
currencySymbol :: DataDeclaration AbstractTy
currencySymbol = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"CurrencySymbol" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT)

tokenName :: DataDeclaration AbstractTy
tokenName :: DataDeclaration AbstractTy
tokenName = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"TokenName" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT)

value :: DataDeclaration AbstractTy
value :: DataDeclaration AbstractTy
value =
  TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype
    TyName
"Value"
    ( TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon
        TyName
"Map"
        [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"CurrencySymbol" [],
          TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TokenName" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]
        ]
    )

lovelace :: DataDeclaration AbstractTy
lovelace :: DataDeclaration AbstractTy
lovelace = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"Lovelace" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT)

rational :: DataDeclaration AbstractTy
rational :: DataDeclaration AbstractTy
rational =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Rational"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Rational" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Pair" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

-- MintValue (V3)

mintValue :: DataDeclaration AbstractTy
mintValue :: DataDeclaration AbstractTy
mintValue =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"MintValue"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"UnsafeMintValue"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon
              TyName
"Map"
              [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"CurrencySymbol" [],
                TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TokenName" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]
              ]
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

-- TxId (v3)
txId :: DataDeclaration AbstractTy
txId :: DataDeclaration AbstractTy
txId = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"TxId" (BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
ByteStringT)

-- TxOutRef (v3)
txOutRef :: DataDeclaration AbstractTy
txOutRef :: DataDeclaration AbstractTy
txOutRef =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"TxOutRef"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxOutRef" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxId" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- TxOut (v2)
txOut :: DataDeclaration AbstractTy
txOut :: DataDeclaration AbstractTy
txOut =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"TxOut"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"TxOut"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Address" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Value" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"OutputDatum" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptHash" []]
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- OutputDatum (v2)
outputDatum :: DataDeclaration AbstractTy
outputDatum :: DataDeclaration AbstractTy
outputDatum =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"OutputDatum"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"NoOutputDatum" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"OutputDatumHash" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DatumHash" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"OutputDatum" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"OutputDatum" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- txInInfo (V3)
txInInfo :: DataDeclaration AbstractTy
txInInfo :: DataDeclaration AbstractTy
txInInfo =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"TxInInfo"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"TxInInfo"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxOutRef" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxOut" []
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- DRepCredential (v3)
dRepCredential :: DataDeclaration AbstractTy
dRepCredential :: DataDeclaration AbstractTy
dRepCredential = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"DRepCredential" (TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [])

-- DRep (v3)
dRep :: DataDeclaration AbstractTy
dRep :: DataDeclaration AbstractTy
dRep =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"DRep"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DRep" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRepCredential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DRepAlwaysAbstain" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DRepAlwaysNoConfidence" []
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- delegatee (v3)
delegatee :: DataDeclaration AbstractTy
delegatee :: DataDeclaration AbstractTy
delegatee =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Delegatee"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DelegStake" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DelegVote" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRep" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DelegStakeVoke" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRep" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

coldCommitteeCredential :: DataDeclaration AbstractTy
coldCommitteeCredential :: DataDeclaration AbstractTy
coldCommitteeCredential = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"ColdCommitteeCredential" (TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [])

hotCommitteeCredential :: DataDeclaration AbstractTy
hotCommitteeCredential :: DataDeclaration AbstractTy
hotCommitteeCredential = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"HotCommitteeCredential" (TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [])

-- txCert (v3)
txCert :: DataDeclaration AbstractTy
txCert :: DataDeclaration AbstractTy
txCert =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"TxCert"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertRegStaking" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertUnRegStaking" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertDelegStaking" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Delegatee" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertRegDeleg" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Delegatee" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertRegDRep" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRepCredential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertUpdateDRep" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRepCredential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertUnRegDRep" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRepCredential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertPoolRegister" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertPoolRetire" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertAuthHotCommittee" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ColdCommitteeCredential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"HotCommitteeCredential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"TxCertResignColdCommittee" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ColdCommitteeCredential" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- voter (v3)
voter :: DataDeclaration AbstractTy
voter :: DataDeclaration AbstractTy
voter =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Voter"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"CommitteeVoter" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"HotCommitteeCredential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"DRepVoter" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DRepCredential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"StakePoolVoter" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- vote (v3)
vote :: DataDeclaration AbstractTy
vote :: DataDeclaration AbstractTy
vote =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Vote"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"VoteNo" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"VoteYes" [],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Abstain" []
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- GovernanceActionID (v3)
governanceActionId :: DataDeclaration AbstractTy
governanceActionId :: DataDeclaration AbstractTy
governanceActionId =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"GovernanceActionId"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"GovernanceActionId"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxId" [],
            BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- Committee (v3)
committee :: DataDeclaration AbstractTy
committee :: DataDeclaration AbstractTy
committee =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Committee"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"Committee"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ColdCommitteeCredential" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Rational" []
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- constitution (V3)
constitution :: DataDeclaration AbstractTy
constitution :: DataDeclaration AbstractTy
constitution = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"Constitution" (TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptHash" []])

-- changedParameters (V3)
changedParameters :: DataDeclaration AbstractTy
changedParameters :: DataDeclaration AbstractTy
changedParameters = TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
"ChangedParameters" (TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Data" [])

-- ProtocolVersion (V3)
protocolVersion :: DataDeclaration AbstractTy
protocolVersion :: DataDeclaration AbstractTy
protocolVersion =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"ProtocolVersion"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"ProtocolVersion" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- GovernanceAction (v3)
governanceAction :: DataDeclaration AbstractTy
governanceAction :: DataDeclaration AbstractTy
governanceAction =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"GovernanceAction"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"ParameterChange"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ChangedParameters" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptHash" []]
          ],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"HardForkInitiation"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ProtocolVersion" []
          ],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"TreasuryWithdrawals"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptHash" []]
          ],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"NoConfidence" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"UpdateCommittee"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ColdCommitteeCredential" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ColdCommitteeCredential" [], BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Rational" []
          ],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"NewConstitution" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" []], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Constitution" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"InfoAction" []
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- ProposalProcedure (v3)
proposalProcedure :: DataDeclaration AbstractTy
proposalProcedure :: DataDeclaration AbstractTy
proposalProcedure =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"ProposalProcedure"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"ProposalProcedure"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceAction" []
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- scriptPurpose (v3)
scriptPurpose :: DataDeclaration AbstractTy
scriptPurpose :: DataDeclaration AbstractTy
scriptPurpose =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"ScriptPurpose"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Minting" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"CurrencySymbol" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Spending" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxOutRef" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Rewarding" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Certifying" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxCert" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Voting" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Voter" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Proposing" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ProposalProcedure" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- ScriptInfo (V3)
scriptInfo :: DataDeclaration AbstractTy
scriptInfo :: DataDeclaration AbstractTy
scriptInfo =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"ScriptInfo"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"MintingScript" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"CurrencySymbol" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"SpendingScript" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxOutRef" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Datum" []]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"RewardingScript" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"CertifyingScript" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxCert" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"VotingScript" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Voter" []],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"ProposingScript" [BuiltinFlatT -> ValT AbstractTy
forall a. BuiltinFlatT -> ValT a
BuiltinFlat BuiltinFlatT
IntegerT, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ProposalProcedure" []]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- This is a TypeSyn, so not a declaration, but it's *annoying* to type the ValT version out
posixTimeRange :: ValT AbstractTy
posixTimeRange :: ValT AbstractTy
posixTimeRange = TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Interval" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"POSIXTime" []]

-- txInfo (v3)
txInfo :: DataDeclaration AbstractTy
txInfo :: DataDeclaration AbstractTy
txInfo =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"TxInfo"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"TxInfo"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxInInfo" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxInInfo" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxOut" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"MintValue" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxCert" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Credential" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
            ValT AbstractTy
posixTimeRange,
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"PubKeyHash" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptPurpose" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Redeemer" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"DatumHash" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Datum" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxId" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Voter" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Map" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"GovernanceActionId" [], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Vote" []]],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"List" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ProposalProcedure" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Lovelace" []]
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- scriptContext (v3)
scriptContext :: DataDeclaration AbstractTy
scriptContext :: DataDeclaration AbstractTy
scriptContext =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"ScriptContext"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor
          ConstructorName
"ScriptContext"
          [ TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"TxInfo" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Redeemer" [],
            TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"ScriptInfo" []
          ]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- Helpers

-- Variants of DataDeclaration and Constructor that use Lists to avoid a slew of Vector.fromList cluttering up the module

data DeclBuilder = Decl TyName (Count "tyvar") [CtorBuilder] DataEncoding

data CtorBuilder = Ctor ConstructorName [ValT AbstractTy]

mkDecl :: DeclBuilder -> DataDeclaration AbstractTy
mkDecl :: DeclBuilder -> DataDeclaration AbstractTy
mkDecl (Decl TyName
tn Count "tyvar"
cnt [CtorBuilder]
ctors DataEncoding
enc) = TyName
-> Count "tyvar"
-> Vector (Constructor AbstractTy)
-> DataEncoding
-> DataDeclaration AbstractTy
forall a.
TyName
-> Count "tyvar"
-> Vector (Constructor a)
-> DataEncoding
-> DataDeclaration a
DataDeclaration TyName
tn Count "tyvar"
cnt ([Constructor AbstractTy] -> Vector (Constructor AbstractTy)
forall a. [a] -> Vector a
Vector.fromList ([Constructor AbstractTy] -> Vector (Constructor AbstractTy))
-> ([CtorBuilder] -> [Constructor AbstractTy])
-> [CtorBuilder]
-> Vector (Constructor AbstractTy)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CtorBuilder -> Constructor AbstractTy)
-> [CtorBuilder] -> [Constructor AbstractTy]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap CtorBuilder -> Constructor AbstractTy
mkCtor ([CtorBuilder] -> Vector (Constructor AbstractTy))
-> [CtorBuilder] -> Vector (Constructor AbstractTy)
forall a b. (a -> b) -> a -> b
$ [CtorBuilder]
ctors) DataEncoding
enc
  where
    mkCtor :: CtorBuilder -> Constructor AbstractTy
    mkCtor :: CtorBuilder -> Constructor AbstractTy
mkCtor (Ctor ConstructorName
cnm [ValT AbstractTy]
fields) = ConstructorName
-> Vector (ValT AbstractTy) -> Constructor AbstractTy
forall a. ConstructorName -> Vector (ValT a) -> Constructor a
Constructor ConstructorName
cnm ([ValT AbstractTy] -> Vector (ValT AbstractTy)
forall a. [a] -> Vector a
Vector.fromList [ValT AbstractTy]
fields)

tycon :: TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon :: TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
tn [ValT AbstractTy]
vals = TyName -> Vector (ValT AbstractTy) -> ValT AbstractTy
forall a. TyName -> Vector (ValT a) -> ValT a
Datatype TyName
tn ([ValT AbstractTy] -> Vector (ValT AbstractTy)
forall a. [a] -> Vector a
Vector.fromList [ValT AbstractTy]
vals)

{- This is shorthand for a non-polymorphic newtype (i.e. a single ctor / arg type with a newtype strategy) where
   the name of the constructor is the same as the name of the type.

   This is a *very* common case and this seems useful to save extra typing.

-}
mkSimpleNewtype :: TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype :: TyName -> ValT AbstractTy -> DataDeclaration AbstractTy
mkSimpleNewtype TyName
tn ValT AbstractTy
val = DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$ TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl TyName
tn Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count0 [ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor (TyName -> ConstructorName
forall a b. Coercible a b => a -> b
coerce TyName
tn) [ValT AbstractTy
val]] (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
NewtypeData)

-- obviously should not export these, solely exist to improve readability of declarations.
-- Since everything here is data-encodeable the DB index *should* always be Z & I don't think anything uses more than
-- 2 tyvars

a :: ValT AbstractTy
a :: ValT AbstractTy
a = AbstractTy -> ValT AbstractTy
forall a. a -> ValT a
Abstraction (DeBruijn -> Index "tyvar" -> AbstractTy
BoundAt DeBruijn
Z Index "tyvar"
forall (ofWhat :: Symbol). Index ofWhat
ix0)

b :: ValT AbstractTy
b :: ValT AbstractTy
b = AbstractTy -> ValT AbstractTy
forall a. a -> ValT a
Abstraction (DeBruijn -> Index "tyvar" -> AbstractTy
BoundAt DeBruijn
Z Index "tyvar"
forall (ofWhat :: Symbol). Index ofWhat
ix1)

-- For tests, much easier to define this here w/ the helpers

-- Note (Koz, 11/07/25): Same as for `list`.

-- | A datatype equivalent to
--
-- @data Tree a = Bin (Tree a) (Tree a) | Tip a@
--
-- @since 1.1.0
tree :: DataDeclaration AbstractTy
tree :: DataDeclaration AbstractTy
tree =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"Tree"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Bin" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Tree" [ValT AbstractTy
a], TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Tree" [ValT AbstractTy
a]],
        ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Tip" [ValT AbstractTy
a]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)

-- | A datatype equivalent to
--
-- @data WeirderList a = Uncons (Maybe (a, WeirderList a))@
--
-- @since 1.1.0
weirderList :: DataDeclaration AbstractTy
weirderList :: DataDeclaration AbstractTy
weirderList =
  DeclBuilder -> DataDeclaration AbstractTy
mkDecl (DeclBuilder -> DataDeclaration AbstractTy)
-> DeclBuilder -> DataDeclaration AbstractTy
forall a b. (a -> b) -> a -> b
$
    TyName
-> Count "tyvar" -> [CtorBuilder] -> DataEncoding -> DeclBuilder
Decl
      TyName
"WeirderList"
      Count "tyvar"
forall (ofWhat :: Symbol). Count ofWhat
count1
      [ ConstructorName -> [ValT AbstractTy] -> CtorBuilder
Ctor ConstructorName
"Uncons" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Maybe" [TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"Pair" [ValT AbstractTy
a, TyName -> [ValT AbstractTy] -> ValT AbstractTy
tycon TyName
"WeirderList" [ValT AbstractTy
a]]]]
      ]
      (PlutusDataStrategy -> DataEncoding
PlutusData PlutusDataStrategy
ConstrData)