aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-26 16:38:33 +0100
committereunhhu <[email protected]>2026-09-26 16:38:33 +0100
commite90d494d718762d402871c9194ab036088dd9e0c (patch)
tree6f4c38c7442d2b1ea1f02019364fe59dea1e90e1 /examples
parentcb0f7878f11025ea31cd4c5cecb5ae359b14c148 (diff)
downloadaup-e90d494d718762d402871c9194ab036088dd9e0c.tar.gz
aup-e90d494d718762d402871c9194ab036088dd9e0c.zip
Add keyed lists and text comparison
state xs: list of R by field keeps its items in that field's order, each key once: xs.add(R { ... }) places an item (a taken key fails the event with exists), xs[key] finds one by halving (its field, or its index), xs.has(key) asks, xs.remove(key) removes. append and insert are refused on a keyed list, add on another, and a key field is never assigned. Texts compare with == != < <= > >= by their bytes. Checked against a Python model over 3,600 random steps with a text-keyed and a number-keyed list; 13 diagnostics; examples/tally.aup.
Diffstat (limited to 'examples')
-rw-r--r--examples/tally.aup32
1 files changed, 32 insertions, 0 deletions
diff --git a/examples/tally.aup b/examples/tally.aup
new file mode 100644
index 0000000..cdff8dd
--- /dev/null
+++ b/examples/tally.aup
@@ -0,0 +1,32 @@
+# Typed words, tallied. A list keyed by the word keeps each word once, in
+# order; tallies[word] finds it by halving, whatever the list's length.
+record Tally {
+ word: text
+ times = 0
+}
+state tallies: list of Tally by word
+state at: index of tallies
+input typed = text
+input forget = key Delete
+input up = key ArrowUp
+input down = key ArrowDown
+
+on typed {
+ if !tallies.has(typed) {
+ tallies.add(Tally { word: typed })
+ }
+ tallies[typed].times = tallies[typed].times + 1
+ at = tallies[typed]
+}
+on forget.down { tallies.remove(at) }
+on up.down { at = at - 1 }
+on down.down { at = at + 1 }
+
+view current = if tallies.count > 0 { "{at.word}: {at.times}" } else { "-" }
+view words = tallies.count
+view typed_total = sum(t.times for t in tallies)
+view most = max(t.times for t in tallies)
+view table = each t in tallies {
+ word = t.word
+ times = t.times
+}