Fields

Fields are like enums, but they can be combined with the + and - operators.

fields MyFields = { foo, bar, baz }

myFields = MyFields.foo + MyFields.bar

myFields = MyFields { foo }
myFields = MyFields { foo, bar }

myFields: MyFields = { foo }
myFields: MyFields = { foo, bar }

Under the hood, fields are stored as integers with size depending on the number of fields.

Number of bits in a field structure = number of fields.

For example, a field with 12 fields will be stored as a 12-bit integer, i.e. two bytes.

Nested fields

Fields can have nested values:

type MyFields = Fields { foo, bar, nested { baz_1, baz_2 } }

myFields = MyFields { foo, bar }
myFields = MyFields { foo, bar, nested }
myFields = MyFields { foo, bar, nested { baz1 } }
myFields = MyFields { foo, bar, nested { baz1, baz2 } }

myFields: MyFields = { foo, bar }
myFields: MyFields = { foo, bar, nested { baz1 } }
myFields: MyFields = { foo, bar, nested { baz1, baz2 } }

-- indicating a nested value is the same as indicating all its values
assert MyFields { nested } == MyFields { nested { baz1, baz2 } }

Get the string representation of a field

A field is internally stored as an unsigned integer.

But you can retrieve the string representation of a field by using the Fields.toStringArray method:

let myFields = MyFields { foo, bar, nested { baz1, baz2 } }

assert myFields == 0b1111 -- 15 in decimal

let myFieldsString = Fields.toStringArray(myFields)

assert myFieldsString == ["foo", "bar", "nested.baz1", "nested.baz2"]