type BufferState { values: List count: Int } bufferStep(value: Int, state: BufferState) (next: BufferState) { values = append(state.values, value) next = BufferState { values = values count = state.count + 1 } } bufferLengthStep(value: Int, state: BufferState) (next: BufferState) { count = length(state.values) + 1 values = append(state.values, value) next = BufferState { values = values count = count } } bufferBuild(values: Bytes) (answer: BufferState) { answer = reduce(bufferStep, values, BufferState { values = [] count = 0 }) } bufferInspect(values: Bytes) (answer: BufferState) { answer = reduce(bufferLengthStep, values, BufferState { values = [] count = 0 }) } type ScalarRow { first: Int second: Int third: Int } scalarTotal(row: ScalarRow) (answer: Int) { answer = row.first + row.second + row.third } readScalarRows(values: List) (answer: Int) { answer = sum(scalarTotal, values) } type Key { First Second } type Row { name: Text count: Int } type Problem { error Denied(message: Text) } number(value: Int) (answer: Int) { answer = value } number(value: null) (answer: Int) { answer = 0 } readKey(key: Int, values: Map) (answer: Int) { answer = number(get(values, key)) } lookup(values: Map, keys: List) (answer: Int) { answer = sum(readKey, keys, values) } readTextKey(key: Text, values: Map) (answer: Int) { answer = number(get(values, key)) } lookupText(values: Map, keys: List) (answer: Int) { answer = sum(readTextKey, keys, values) } entryValue(entry: MapEntry) (answer: Int) { answer = entry.value } scan(values: Map) (answer: Int) { answer = sum(entryValue, entries(values)) } insert(item: Int, state: Map) (next: Map) { next = put(state, item, item) } buildMap(values: List) (answer: Map) { answer = reduce(insert, values, {}) } buildEntries(values: List) (answer: List>) { answer = entries(buildMap(values)) } add(item: Int, state: List) (next: List) { next = append(state, item) } buildList(values: List) (answer: List) { answer = reduce(add, values, []) } rewrite(entry: MapEntry) (answer: MapEntry) { answer = entry answer.key = "new" answer.value.name = "changed" } rowValue(entry: MapEntry) (answer: Row) { answer = entry.value } duplicate(first_key: Text, second_key: Text) (answer: Map) { answer = { first_key = 1 second_key = 2 } } duplicateEntry() (answer: Map) { answer = duplicate("same", "same") } denyText() (answer: Text) { fail(Problem.Denied("first")) } faultText(value: Int) (answer: Text) { checked = value + 1 answer = "key" } failureEntry() (answer: Map) { answer = { denyText() = faultText(9223372036854775807) } } faultEntry() (answer: Map) { answer = { faultText(9223372036854775807) = denyText() } } lookupFailure() (answer: Text?) { answer = get({ "item" = denyText() }, faultText(9223372036854775807)) } lookupFault() (answer: Text?) { answer = get({ "item" = faultText(9223372036854775807) }, denyText()) } optional(values: Map) (answer: Int?) { answer = get(values, "present") } verify() (answer: Bool) { original = { "a" = 1 "b" = 2 } changed = put(original, "a", 3) extended = put(changed, "c", 4) removed = remove(extended, "a") reinserted = put(removed, "a", 5) answer = original == { "a" = 1 "b" = 2 } and changed == { "a" = 3 "b" = 2 } answer = answer and original != { "b" = 2 "a" = 1 } and reinserted == { "b" = 2 "c" = 4 "a" = 5 } answer = answer and get(original, "none") == null and get(original, "a") == 1 answer = answer and optional({ "present" = null }) == null and optional({ "present" = 7 }) == 7 answer = answer and length(remove(original, "missing")) == 2 rows = { "old" = Row { name = "雪" count = 4 } } rewritten = each(rewrite, entries(rows)) answer = answer and each(rowValue, rewritten) == [Row { name = "changed" count = 4 }] answer = answer and get(rows, "old") == Row { name = "雪" count = 4 } choices = { Key.First = 7 Key.Second = 9 } booleans = { true = "yes" false = "no" } answer = answer and get(choices, Key.Second) == 9 and get(booleans, false) == "no" list = [1, 2] appended = append(list, 3) answer = answer and list == [1, 2] and appended == [1, 2, 3] and first(list) == 1 answer = answer and buildList([3, 1, 4]) == [3, 1, 4] and length(buildList([])) == 0 built = buildMap([3, 1, 4, 1]) answer = answer and built == { 3 = 3 1 = 1 4 = 4 } and lookup(built, [4, 1, 99]) == 5 and scan(built) == 8 answer = answer and length(buildMap([])) == 0 answer = answer and buildEntries([3, 1, 4, 1]) == entries(built) } staticLookupFailure() (answer: Text?) { answer = get({ "selected" = "kept" "other" = denyText() }, "selected") } staticMissingFailure() (answer: Text?) { answer = get({ "other" = denyText() }, "missing") } traceMapValue(value: Text) (answer: Text) { dever.io.println(value) answer = value } traceLiteralLookup() (answer: Bool) { value = get({ "a" = traceMapValue("first") "b" = traceMapValue("second") "c" = traceMapValue("third") }, "a") listed = first([traceMapValue("fourth"), traceMapValue("fifth")]) answer = value == "first" and listed == "fourth" }