Skip to content

Enums

Enums let a value be one of several named variants.

type Language := enum {
FRENCH : FrenchData,
ENGLISH : int,
SPANISH,
ARABIC : <Language, Language>
};

Each variant may carry different kinds of data:

  • no payload at all, like SPANISH
  • a single value, like ENGLISH : int
  • a struct payload, like FRENCH : FrenchData
  • a tuple payload, like ARABIC : <Language, Language>

You create enum values by naming the variant.

let english : Language = Language.ENGLISH : 6;
let french := Language.FRENCH : FrenchData { data : 10, code : 5 };
let spanish := Language.SPANISH;

Enums are most powerful when combined with pattern matching.

match english {
.ENGLISH : level => print(level),
.SPANISH => print("spanish"),
_ => print("other")
};

Payloads can be destructured directly in the match arm.

match french {
.FRENCH : {data: d, code: c} => print(d + c),
_ => print("other")
};

Tuple payloads can also be destructured.

type PairEnum := enum { Normal : Pair, Tuple : <int, int> };
match PairEnum.Tuple : (10, 30) {
.Tuple : (left, right) => print(left + right),
_ => {}
};

Use enums when a value can take several different shapes, and each shape should be handled explicitly.