insertText(item: Text, state: Map) (next: Map) { next = put(state, item, item) } buildText(values: List) (answer: Map) { answer = reduce(insertText, values, {}) } textWeight(entry: MapEntry) (answer: Int) { answer = length(entry.key) + length(entry.value) } ownedText(values: List) (answer: Int) { answer = sum(textWeight, entries(buildText(values))) } borrowedText(values: Map) (answer: Int) { answer = sum(textWeight, entries(values)) } insertNested(item: Text, state: Map>) (next: Map>) { next = put(state, item, [item, item]) } buildNested(values: List) (answer: Map>) { answer = reduce(insertNested, values, {}) } textSize(value: Text) (answer: Int) { answer = length(value) } nestedWeight(entry: MapEntry>) (answer: Int) { answer = length(entry.key) + sum(textSize, entry.value) } ownedNested(values: List) (answer: Int) { answer = sum(nestedWeight, entries(buildNested(values))) } borrowedNested(values: Map>) (answer: Int) { answer = sum(nestedWeight, entries(values)) } verify() (answer: Bool) { values = ["雪山", "oak", "雪山"] text = buildText(values) nested = buildNested(values) answer = ownedText(values) == 10 and borrowedText(text) == 10 answer = answer and ownedNested(values) == 15 and borrowedNested(nested) == 15 answer = answer and borrowedText(text) == 10 and borrowedNested(nested) == 15 answer = answer and values == ["雪山", "oak", "雪山"] answer = answer and ownedText([]) == 0 and ownedNested([]) == 0 mixed = { 1 = "a" 2 = "雪" } answer = answer and readMixed(mixed) == 5 and get(mixed, 1) == "a" answer = answer and texts(text) == ["雪山", "oak"] and borrowedText(text) == 10 answer = answer and nestedValues(nested) == [["雪山", "雪山"], ["oak", "oak"]] answer = answer and borrowedNested(nested) == 15 answer = answer and firstText("雪") == "雪" and lookupText("oak") == "oak" answer = answer and nullableFirst(null) == null and nullableFirst("kept") == "kept" answer = answer and get({ "item" = "kept" }, "missing") == null answer = answer and nullableLookup(null) == null and nullableLookup("kept") == "kept" selected = selectText("kept") answer = answer and selected.first_value == "kept" and selected.lookup_value == "kept" picked = filterText(text, "oak") answer = answer and each(entryText, picked) == ["oak"] answer = answer and findText(text, "oak") == first(picked) answer = answer and findText(text, "absent") == null and length(filterText(text, "absent")) == 0 answer = answer and findText({}, "absent") == null and length(filterText({}, "absent")) == 0 answer = answer and each(entryNested, filterNested(nested, "oak")) == [["oak", "oak"]] answer = answer and findNested(nested, "oak") == first(filterNested(nested, "oak")) answer = answer and findNested(nested, "absent") == null answer = answer and filterMixed(mixed, 2) == entries({ 2 = "雪" }) same = { "first" = "match" "second" = "match" } answer = answer and filterText(same, "match") == entries(same) answer = answer and findText(same, "match") == first(entries(same)) changed = each(entryText, picked) changed = append(changed, "独立值") answer = answer and changed == ["oak", "独立值"] and get(text, "oak") == "oak" answer = answer and borrowedText(text) == 10 and borrowedNested(nested) == 15 } mixedWeight(entry: MapEntry) (answer: Int) { answer = entry.key + length(entry.value) } readMixed(values: Map) (answer: Int) { answer = sum(mixedWeight, entries(values)) } entryText(entry: MapEntry) (answer: Text) { answer = entry.value } texts(values: Map) (answer: List) { answer = each(entryText, entries(values)) } entryNested(entry: MapEntry>) (answer: List) { answer = entry.value } nestedValues(values: Map>) (answer: List>) { answer = each(entryNested, entries(values)) } firstText(value: Text) (answer: Text?) { answer = first([value]) } lookupText(value: Text) (answer: Text?) { answer = get({ "item" = value }, "item") } nullableFirst(value: Text?) (answer: Text?) { answer = first([value]) } nullableLookup(value: Text?) (answer: Text?) { answer = get({ "item" = value }, "item") } selectText(value: Text) (first_value: Text?, lookup_value: Text?) { values = [value] mapping = { "item" = value } first_value = first(values) lookup_value = get(mapping, "item") } matchText(entry: MapEntry, target: Text) (answer: Bool) { answer = entry.value == target } filterText(values: Map, target: Text) (answer: List>) { answer = filter(matchText, entries(values), target) } findText(values: Map, target: Text) (answer: MapEntry?) { answer = find(matchText, entries(values), target) } matchNested(entry: MapEntry>, target: Text) (answer: Bool) { answer = entry.key == target } filterNested(values: Map>, target: Text) (answer: List>>) { answer = filter(matchNested, entries(values), target) } findNested(values: Map>, target: Text) (answer: MapEntry>?) { answer = find(matchNested, entries(values), target) } matchMixed(entry: MapEntry, minimum: Int) (answer: Bool) { answer = entry.key >= minimum } filterMixed(values: Map, minimum: Int) (answer: List>) { answer = filter(matchMixed, entries(values), minimum) }