DataLowering

scalus.compiler.sir.lowering.simple.DataLowering
trait DataLowering

Trait providing Data type lowering support for simple lowering backends.

Data is a builtin Plutus type with 5 constructors:

  • Constr(tag: Integer, args: List[Data])
  • Map(entries: List[(Data, Data)])
  • List(elements: List[Data])
  • I(value: Integer)
  • B(value: ByteString)

This trait provides methods for:

  • Lowering Data constructors to UPLC builtins (iData, bData, listData, mapData, constrData)
  • Lowering pattern matches on Data (chooseData)
  • Lowering field selections on Data variants (unIData, unBData, etc.)

Attributes

Graph
Supertypes
class Object
trait Matchable
class Any
Known subtypes
Self type

Members list

Value members

Concrete methods

protected def isDataConstructor(name: String): Boolean

Check if a constructor name is a Data type constructor.

Check if a constructor name is a Data type constructor.

Attributes

protected def isDataType(sirType: SIRType): Boolean

Check if a SIR type is the builtin Data type.

Check if a SIR type is the builtin Data type.

Attributes

protected def isDataVariantType(sirType: SIRType): Boolean

Check if a scrutinee type is a known Data variant (I, B, List, Map, Constr).

Check if a scrutinee type is a known Data variant (I, B, List, Map, Constr).

Attributes

protected def lowerDataCaseBranch(sirCase: Case, variantName: String, scrutineeRef: Term): Term

Lower a single case branch for Data pattern matching.

Lower a single case branch for Data pattern matching.

For chooseData, branches are thunks that reference a pre-bound scrutinee. We extract values from the scrutinee within each branch.

Attributes

protected def lowerDataConstr(name: String, args: List[SIR], anns: AnnotationsDecl): Term

Lower a Data constructor expression to UPLC.

Lower a Data constructor expression to UPLC.

Data constructors are lowered to their corresponding builtin functions:

  • Data.I(value) → iData(value)
  • Data.B(value) → bData(value)
  • Data.List(values) → listData(values)
  • Data.Map(values) → mapData(values)
  • Data.Constr(tag, args) → constrData(tag, args)

Attributes

protected def lowerDataMatch(matchExpr: Match): Term

Lower a match expression on Data type.

Lower a match expression on Data type.

Data has 5 constructors in a fixed order:

  • 0: Constr (tag: Integer, args: List[Data])
  • 1: Map (entries: List[(Data, Data)])
  • 2: List (elements: List[Data])
  • 3: I (value: Integer)
  • 4: B (value: ByteString)

The variants are dispatched via the chooseData builtin on every protocol version. The Case instruction is no alternative: it rejects a Data scrutinee before dijkstraPV, and from dijkstraPV on it only scrutinizes Data.Constr, selecting the branch by the constructor tag.

  • chooseData just selects a delayed branch, it doesn't pass arguments
  • We bind the scrutinee first, then extract values within each branch

Attributes

protected def lowerDataSelect(scrutinee: SIR, field: String, tp: SIRType, anns: AnnotationsDecl): Term

Lower a field selection on Data type.

Lower a field selection on Data type.

Data field selections are lowered to their corresponding builtin unpack functions:

  • Data.I.value → unIData(scrutinee)
  • Data.B.value → unBData(scrutinee)
  • Data.List.values → unListData(scrutinee)
  • Data.Map.values → unMapData(scrutinee)
  • Data.Constr.constr → fstPair(unConstrData(scrutinee))
  • Data.Constr.args → sndPair(unConstrData(scrutinee))

Attributes