--- A DSL for constructing Kudos exchange intents
module Kudos.IntentDsl;

import Stdlib.Prelude open hiding {for; any; all};
import Anoma open public;
import Kudos.ExampleKinds open public;
import Kudos.Asset open;

type Quantifier :=
  | Any
  | All;

type QuantifiedAssets :=
  mkAssets {
    quantifier : Quantifier;
    assets : List Asset
  };

syntax operator of_ additive;
syntax alias of_ := mkAsset;

type Intention :=
  | Want
  | Give;

type Clause :=
  mkClause {
    lhs : Intention × QuantifiedAssets;
    rhs : QuantifiedAssets
  };

any (as : List Asset) : QuantifiedAssets :=
  mkAssets@{
    quantifier := Any;
    assets := as
  };

all (as : List Asset) : QuantifiedAssets :=
  mkAssets@{
    quantifier := All;
    assets := as
  };

exactly (a : Asset) : QuantifiedAssets :=
  mkAssets@{
    quantifier := All;
    assets := [a]
  };

want (a : QuantifiedAssets) : Intention × QuantifiedAssets := Want, a;

give (a : QuantifiedAssets) : Intention × QuantifiedAssets := Give, a;

syntax operator for pair;

for (l : Intention × QuantifiedAssets) (qs : QuantifiedAssets) : Clause :=
  mkClause@{
    lhs := l;
    rhs := qs
  };

kudosIntent (clauses : List Clause) : Transaction := mkKudosIntent clauses;

axiom mkKudosIntent : List Clause -> Transaction;
Last modified on 2024-04-18 10:12 UTC