on master help sign in
Write casts and ?- arms in the canonical layout

The formatter's one layout now says where a cast and a ?- go (S13 of the 2026-11-02 syntax review, with S2's flat arms), in grammar.md's Spacing bullet: a cast whose expression takes the deeper lines goes at the end of the |=, ++ or arm line it belongs to, and one whose expression fits on its own line goes on the line below with it; every ?- begins its own line below the line it belongs to, with its arms at its depth where the rest of a body allows that, and one level deeper on an open bracket's line. The prelude, my-app's todo-list, basket and cart store, and the spec's examples (grammar.md's step, cart and basket, core-language.md's update, overview.md's todo-list) are rewritten to it. This is layout only: no gate's sample or meaning changes. Each file parses to the same tree as before once positions are set aside and a body with no definitions is read as its expression (the checker's rule; the ten casts moved onto their |=, ++ or arm line lose that wrapper), and gets the same type report. The prelude's deepest indentation goes from 16 columns to 8. The doc-* cases for the changed examples follow their blocks, with new positions only. The design notes' cart tree and error example follow the new layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U4FzmThon6Q3x1uL8yUKEY

commit138acf9225fb60134a53fe713943b513c512fa1a authorClaude <noreply@anthropic.com> dateTue 3 Nov 2026, 03:07 (9 hours ago) parent98daa20
25 files changed+807−822
docs/spec/core-language.md+8−8 docs/spec/grammar.md+13−13 docs/spec/overview.md+8−8 jibb-dev/lib/jibb.hoon+17−15 jibb-dev/lib/jibb/prelude.jibb+171−181 my-app/ui/basket.jibb+5−5 my-app/ui/stores/cart.jibb+2−2 my-app/ui/todo-list.jibb+8−8 tests/golden/doc-core-02-update/about.txt+1−1 tests/golden/doc-core-02-update/source.jibb+8−8 tests/golden/doc-core-02-update/tokens.txt+120−122 tests/golden/doc-core-02-update/tree.txt+64−64 tests/golden/doc-grammar-04-step/about.txt+1−1 tests/golden/doc-grammar-04-step/source.jibb+5−5 tests/golden/doc-grammar-04-step/tokens.txt+36−37 tests/golden/doc-grammar-04-step/tree.txt+13−13 tests/golden/doc-grammar-06-cart-store/about.txt+1−1 tests/golden/doc-grammar-06-cart-store/tokens.txt+27−28 tests/golden/doc-grammar-06-cart-store/tree.txt+11−11 tests/golden/doc-grammar-07-basket/about.txt+1−1 tests/golden/doc-grammar-07-basket/tokens.txt+71−72 tests/golden/doc-grammar-07-basket/tree.txt+33−33 tests/golden/doc-overview-10-todo-list/about.txt+1−1 tests/golden/doc-overview-10-todo-list/tokens.txt+118−120 tests/golden/doc-overview-10-todo-list/tree.txt+64−64
docs/spec/core-language.md+8−8
@@ -105,14 +105,14 @@ The todo island's `update`, from worked example 3:
105105```jibb
106106++ update |= [=msg m=model]
107107 ?- msg
108− [%typed t]
109− ?- (gth (lent (tuba (trip t))) 80)
110− %.y [m(draft=t error=`"Too long") ~]
111− %.n [m(draft=t error=~) ~]
112− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
113− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
114− [%got ts] [m(todos=ts) ~]
115− [%acked err] [m(error=err) ~]
108+ [%typed t]
109+ ?- (gth (lent (tuba (trip t))) 80)
110+ %.y [m(draft=t error=`"Too long") ~]
111+ %.n [m(draft=t error=~) ~]
112+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
113+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
114+ [%got ts] [m(todos=ts) ~]
115+ [%acked err] [m(error=err) ~]
116116```
117117
118118lowers to the program below. The model `[todos draft error]` puts `todos` at axis 2, `draft` at 6 and `error` at 7, and `%submit`, the only atom case, needs no test once `cell?` fails.
docs/spec/grammar.md+13−13
@@ -10,7 +10,7 @@ The syntax the compiler accepts.
1010- **Layout tokens**: a deeper line emits INDENT, the same depth NEWLINE, a shallower one a DEDENT per closed level, then NEWLINE.
1111- **Open brackets**: a bracket open at line end takes one item per deeper line and closes at the first line that isn't deeper, with no closer. Brackets opened and closed on one line work as usual. A mold's `[` and `(` open the same way, with one field or mold per deeper line. A line may leave several brackets open: the deeper lines go to the last one, or to the body of the last rune, and the others close with it, so `(column ~ ~[` above its items needs no `)`. On the opener's line, spaces separate items, so `~[text "a"` holds two items. In an expression's open bracket each deeper line is one whole item: `text "a"` there is `(text "a")`, `label=trim " x "` is `label=(trim " x ")`, and under a `(` alone the first deeper line is the head. A mold's open bracket takes exactly one field or mold per deeper line.
1212- **Tight forms**: `a+b`, `a.b`, `` `x ``, `|=%got` and the openers `~[`, `|=(`, `$-(` take no spaces. A `(` right after a wing is a change: `m(note=text)` changes, `m (note text)` calls. `%/` starts an application path, `%/blog/(slug)`.
13−- **Spacing**: one space between items; more for alignment. That is style, which the formatter keeps: the parser takes one or more spaces between items, and allows spaces after an opener, before a closer and at the end of a line. Faces `name=value`, puns `=name` and typed path segments `[id=@ud]` take no spaces, and a rune is followed by one.
13+- **Spacing**: one space between items; more for alignment. That is style, which the formatter keeps: the parser takes one or more spaces between items, and allows spaces after an opener, before a closer and at the end of a line. Faces `name=value`, puns `=name` and typed path segments `[id=@ud]` take no spaces, and a rune is followed by one. The formatter puts a cast whose expression takes the deeper lines at the end of the line it belongs to, the `|=`, `++` or arm line, and a cast whose expression fits on its own line on the line below with it. It starts every `?-` on its own line, below the line it belongs to, with its arms at its depth where the rest of a body allows that, and one level deeper on an open bracket's line.
1414- **Comments**: `::` to the end of the line, outside strings; inside a string, `::` is text.
1515- **Names**: Hoon terms; lowercase letters, digits and hyphens, starting with a letter.
1616- **Type variables**: a capital, then lowercase letters and digits: `A`, `Msg`, `T2`. `AB`, `MSG`, `Msg_x` and `Msg-x` are errors. In a mold, a capitalized name is a type variable and a lowercase name is a mold: the reverse of Elm, where `Msg` is a concrete type and `msg` a type variable.
@@ -223,11 +223,11 @@ Tags can sit anywhere in a case, and a case can carry several:
223223
224224++ describe |= s=step
225225 ?- s
226− [%move %left n] "left {n}"
227− [%move %right n] "right {n}"
228− [t %draft] t
229− [t %sent sent-at] t
230− %stop "stop"
226+ [%move %left n] "left {n}"
227+ [%move %right n] "right {n}"
228+ [t %draft] t
229+ [t %sent sent-at] t
230+ %stop "stop"
231231```
232232
233233Leaving out `%stop` is an error naming it; to crash instead, write `%stop !!`.
@@ -322,8 +322,8 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
322322++ init ^- state [items=~ open=%.n]
323323++ update |= [a=poke s=state]
324324 ?- a
325− [%add item] s(items=[item items.s])
326− %toggle s(open=(not open.s))
325+ [%add item] s(items=[item items.s])
326+ %toggle s(open=(not open.s))
327327```
328328
329329```jibb
@@ -345,11 +345,11 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
345345
346346++ update |= [=msg m=model]
347347 ?- msg
348− [%noted t] [m(note=t) ~]
349− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
350− %toggle [m ~[(poke.cart %toggle |=%acked)]]
351− [%got c] [m(cart=c) ~]
352− [%acked err] [m ~]
348+ [%noted t] [m(note=t) ~]
349+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
350+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
351+ [%got c] [m(cart=c) ~]
352+ [%acked err] [m ~]
353353
354354++ subs |= m=model
355355 ~[[%watch (state.cart |=%got)]]
docs/spec/overview.md+8−8
@@ -469,14 +469,14 @@ A `page`: each request scries `%blog` and renders in Nock.
469469
470470++ update |= [=msg m=model]
471471 ?- msg
472− [%typed t]
473− ?- (gth (lent (tuba (trip t))) 80)
474− %.y [m(draft=t error=`"Too long") ~]
475− %.n [m(draft=t error=~) ~]
476− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
477− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
478− [%got ts] [m(todos=ts) ~]
479− [%acked err] [m(error=err) ~]
472+ [%typed t]
473+ ?- (gth (lent (tuba (trip t))) 80)
474+ %.y [m(draft=t error=`"Too long") ~]
475+ %.n [m(draft=t error=~) ~]
476+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
477+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
478+ [%got ts] [m(todos=ts) ~]
479+ [%acked err] [m(error=err) ~]
480480
481481++ subs |= m=model
482482 ~[[%watch (todos.todo |=%got)]]
jibb-dev/lib/jibb.hoon+17−15
@@ -810,7 +810,9 @@
810810:: (value 8:1 init
811811:: (cast 8:9
812812:: (ref 8:12 state)
813−:: (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
813+:: (tuple 8:18
814+:: (face 8:19 items (lit 8:25 ~))
815+:: (face 8:27 open (lit 8:32 %.n)))))
814816:: (value 9:1 update
815817:: (gate 9:11
816818:: (cell 9:14
@@ -819,17 +821,17 @@
819821:: (body 10:3
820822:: (branch 10:3
821823:: (wing 10:6 a)
822−:: (arm 11:5
823−:: (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
824−:: (change 11:18 s
825−:: (edit 11:20 items
826−:: (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
827−:: (arm 12:5
828−:: (lit 12:5 %toggle)
829−:: (change 12:18 s
830−:: (edit 12:20 open
831−:: (group 12:25
832−:: (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
824+:: (arm 11:3
825+:: (cell 11:3 (lit 11:4 %add) (bind 11:9 item))
826+:: (change 11:16 s
827+:: (edit 11:18 items
828+:: (tuple 11:24 (wing 11:25 item) (wing 11:30 items.s)))))
829+:: (arm 12:3
830+:: (lit 12:3 %toggle)
831+:: (change 12:16 s
832+:: (edit 12:18 open
833+:: (group 12:23
834+:: (call 12:24 (wing 12:24 not) (wing 12:28 open.s)))))))))))
833835::
834836:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
835837:: source line, then a caret under the column (col - 1 spaces, then ^).
@@ -840,9 +842,9 @@
840842:: prints as a space, so the caret stays under its column and golden
841843:: files hold no raw control bytes.
842844::
843−:: /ui/basket.jibb:22:5: msg has no case %submitt
844−:: %submitt [m(note="") ~]
845−:: ^
845+:: /ui/basket.jibb:22:3: msg has no case %submitt
846+:: %submitt [m(note="") ~]
847+:: ^
846848::
847849|%
848850+| %positions
jibb-dev/lib/jibb/prelude.jibb+171−181
@@ -8,16 +8,16 @@
88
99++ head |= p=[A B]
1010 ?- p
11− [a b] a
11+ [a b] a
1212
1313++ tail |= p=[A B]
1414 ?- p
15− [a b] b
15+ [a b] b
1616
1717++ not |= b=?
1818 ?- b
19− %.y %.n
20− %.n %.y
19+ %.y %.n
20+ %.n %.y
2121
2222++ eq |= args=[A A] (eq-data.internal args)
2323
@@ -31,31 +31,29 @@
3131
3232++ fall |= args=[(unit A) A]
3333 ?- args
34− [maybe fallback]
35− ?- maybe
36− ~ fallback
37− [~ value] value
34+ [maybe fallback]
35+ ?- maybe
36+ ~ fallback
37+ [~ value] value
3838
3939++ need |= maybe=(unit A)
4040 ?- maybe
41− ~ !!
42− [~ value] value
41+ ~ !!
42+ [~ value] value
4343
4444++ weld |= args=[(list A) (list A)]
4545 ?- args
46− [xs ys]
47− ^- (list A)
48− ?- xs
49− ~ ys
50− [item rest] [item (weld rest ys)]
46+ [xs ys] ^- (list A)
47+ ?- xs
48+ ~ ys
49+ [item rest] [item (weld rest ys)]
5150
5251++ turn |= args=[(list A) $-(A B)]
5352 ?- args
54− [xs f]
55− ^- (list B)
56− ?- xs
57− ~ ~
58− [item rest] [(f item) (turn rest f)]
53+ [xs f] ^- (list B)
54+ ?- xs
55+ ~ ~
56+ [item rest] [(f item) (turn rest f)]
5957
6058+$ dime [p=@ta q=@]
6159
@@ -104,17 +102,16 @@
104102+$ like |$ [A] [p=hair q=(unit [p=A q=nail])]
105103
106104++ like |= [f=$-(A B) result=(like A)]
107− ++ mapped
108− ^- (unit [p=B q=nail])
109− ?- q.result
110− ~ ~
111− [~ value] `[p=(f p.value) q=q.value]
105+ ++ mapped ^- (unit [p=B q=nail])
106+ ?- q.result
107+ ~ ~
108+ [~ value] `[p=(f p.value) q=q.value]
112109 ^- (like B) [p=p.result q=mapped]
113110
114111++ wonk |= veq=(like A)
115112 ?- q.veq
116− ~ !!
117− [~ product] p.product
113+ ~ !!
114+ [~ product] p.product
118115
119116+$ lone |$ [A] [p=A]
120117
@@ -143,214 +140,209 @@
143140
144141++ snoc |= args=[(list A) A]
145142 ?- args
146− [xs item] (weld xs [item ~])
143+ [xs item] (weld xs [item ~])
147144
148145++ flop |= xs=(list A)
149146 ++ reverse-into |= args=[(list A) (list A)]
150147 ?- args
151− [rest acc]
152− ?- rest
153− ~ acc
154− [item more] (reverse-into more [item acc])
148+ [rest acc]
149+ ?- rest
150+ ~ acc
151+ [item more] (reverse-into more [item acc])
155152 (reverse-into xs ~)
156153
157−++ drop |= maybe=(unit A)
158− ^- (list A)
159− ?- maybe
160− ~ ~
161− [~ value] [value ~]
154+++ drop |= maybe=(unit A) ^- (list A)
155+ ?- maybe
156+ ~ ~
157+ [~ value] [value ~]
162158
163159++ bond |= fallback=$-(~ A)
164160 |= maybe=(unit A)
165161 ?- maybe
166− ~ (fallback ~)
167− [~ value] value
162+ ~ (fallback ~)
163+ [~ value] value
168164
169165++ bind |= args=[(unit A) $-(A B)]
170166 ?- args
171− [maybe f] ^- (unit B)
172− ?- maybe
173− ~ ~
174− [~ value] `(f value)
167+ [maybe f] ^- (unit B)
168+ ?- maybe
169+ ~ ~
170+ [~ value] `(f value)
175171
176172++ biff |= args=[(unit A) $-(A (unit B))]
177173 ?- args
178− [maybe f] ^- (unit B)
179− ?- maybe
180− ~ ~
181− [~ value] (f value)
174+ [maybe f] ^- (unit B)
175+ ?- maybe
176+ ~ ~
177+ [~ value] (f value)
182178
183179++ both |= args=[(unit A) (unit B)]
184180 ?- args
185− [first second] ^- (unit [A B])
186− ?- first
187− ~ ~
188− [~ a]
189− ?- second
190− ~ ~
191− [~ b] `[a b]
181+ [first second] ^- (unit [A B])
182+ ?- first
183+ ~ ~
184+ [~ a]
185+ ?- second
186+ ~ ~
187+ [~ b] `[a b]
192188
193189++ clap |= args=[(unit A) (unit A) $-([A A] A)]
194190 ?- args
195− [first second combine] ^- (unit A)
196− ?- first
197− ~ second
198− [~ a]
199− ?- second
200− ~ first
201− [~ b] `(combine a b)
191+ [first second combine] ^- (unit A)
192+ ?- first
193+ ~ second
194+ [~ a]
195+ ?- second
196+ ~ first
197+ [~ b] `(combine a b)
202198
203199++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
204200 ?- args
205− [choose first second] ^- (unit A)
206− ?- first
207− ~ second
208− [~ a]
209− ?- second
210− ~ first
211− [~ b]
212− ?- (choose a b)
213− %.y first
214− %.n second
201+ [choose first second] ^- (unit A)
202+ ?- first
203+ ~ second
204+ [~ a]
205+ ?- second
206+ ~ first
207+ [~ b]
208+ ?- (choose a b)
209+ %.y first
210+ %.n second
215211
216212++ mate |= args=[(unit A) (unit A)]
217213 ?- args
218− [first second] ^- (unit A)
219− ?- second
220− ~ first
221− [~ b]
222− ?- first
223− ~ second
224− [~ a]
225− ?- (eq a b)
226− %.y first
227− %.n !!
214+ [first second] ^- (unit A)
215+ ?- second
216+ ~ first
217+ [~ b]
218+ ?- first
219+ ~ second
220+ [~ a]
221+ ?- (eq a b)
222+ %.y first
223+ %.n !!
228224
229225++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
230226 ?- args
231− [first second combine] ^- (unit C)
232− ?- first
233− ~ ~
234− [~ a]
235− ?- second
236− ~ ~
237− [~ b] (combine a b)
227+ [first second combine] ^- (unit C)
228+ ?- first
229+ ~ ~
230+ [~ a]
231+ ?- second
232+ ~ ~
233+ [~ b] (combine a b)
238234
239235++ skim |= args=[(list A) $-(A ?)]
240236 ?- args
241− [xs predicate] ^- (list A)
242− ?- xs
243− ~ ~
244− [item rest]
245− ?- (predicate item)
246− %.y [item (skim rest predicate)]
247− %.n (skim rest predicate)
237+ [xs predicate] ^- (list A)
238+ ?- xs
239+ ~ ~
240+ [item rest]
241+ ?- (predicate item)
242+ %.y [item (skim rest predicate)]
243+ %.n (skim rest predicate)
248244
249245++ skip |= args=[(list A) $-(A ?)]
250246 ?- args
251− [xs predicate] ^- (list A)
252− ?- xs
253− ~ ~
254− [item rest]
255− ?- (predicate item)
256− %.y (skip rest predicate)
257− %.n [item (skip rest predicate)]
258−
259−++ levy |= args=[(list A) $-(A ?)]
260− ^- ?
261− ?- args
262− [xs predicate]
263− ?- xs
264− ~ %.y
265− [item rest]
266− ?- (predicate item)
267− %.y (levy rest predicate)
268− %.n %.n
269−
270−++ lien |= args=[(list A) $-(A ?)]
271− ^- ?
272− ?- args
273− [xs predicate]
274− ?- xs
275− ~ %.n
276− [item rest]
277− ?- (predicate item)
278− %.y %.y
279− %.n (lien rest predicate)
247+ [xs predicate] ^- (list A)
248+ ?- xs
249+ ~ ~
250+ [item rest]
251+ ?- (predicate item)
252+ %.y (skip rest predicate)
253+ %.n [item (skip rest predicate)]
254+
255+++ levy |= args=[(list A) $-(A ?)] ^- ?
256+ ?- args
257+ [xs predicate]
258+ ?- xs
259+ ~ %.y
260+ [item rest]
261+ ?- (predicate item)
262+ %.y (levy rest predicate)
263+ %.n %.n
264+
265+++ lien |= args=[(list A) $-(A ?)] ^- ?
266+ ?- args
267+ [xs predicate]
268+ ?- xs
269+ ~ %.n
270+ [item rest]
271+ ?- (predicate item)
272+ %.y %.y
273+ %.n (lien rest predicate)
280274
281275++ roll |= args=[(list A) B $-([A B] B)]
282276 ?- args
283− [xs start combine]
284− ?- xs
285− ~ start
286− [item rest] (roll rest (combine item start) combine)
277+ [xs start combine]
278+ ?- xs
279+ ~ start
280+ [item rest] (roll rest (combine item start) combine)
287281
288282++ reel |= args=[(list A) B $-([A B] B)]
289283 ?- args
290− [xs start combine]
291− ?- xs
292− ~ start
293− [item rest] (combine item (reel rest start combine))
284+ [xs start combine]
285+ ?- xs
286+ ~ start
287+ [item rest] (combine item (reel rest start combine))
294288
295289++ flit |= predicate=$-(A ?)
296− |= value=A
297− ^- (unit A)
298− ?- (predicate value)
299− %.y `value
300− %.n ~
290+ |= value=A ^- (unit A)
291+ ?- (predicate value)
292+ %.y `value
293+ %.n ~
301294
302295++ murn |= args=[(list A) $-(A (unit B))]
303296 ?- args
304− [xs f] ^- (list B)
305− ?- xs
306− ~ ~
307− [item rest]
308− ?- (f item)
309− ~ (murn rest f)
310− [~ value] [value (murn rest f)]
297+ [xs f] ^- (list B)
298+ ?- xs
299+ ~ ~
300+ [item rest]
301+ ?- (f item)
302+ ~ (murn rest f)
303+ [~ value] [value (murn rest f)]
311304
312305++ join |= args=[A (list A)]
313306 ?- args
314− [separator xs] ^- (list A)
315− ?- xs
316− ~ ~
317− [item rest]
318− ?- rest
319− ~ [item ~]
320− [next more] [item [separator (join separator rest)]]
321−
322−++ snip |= xs=(list A)
323− ^- (list A)
307+ [separator xs] ^- (list A)
324308 ?- xs
325− ~ ~
326− [item rest]
327− ?- rest
328− ~ ~
329− [next more] [item (snip rest)]
309+ ~ ~
310+ [item rest]
311+ ?- rest
312+ ~ [item ~]
313+ [next more] [item [separator (join separator rest)]]
314+
315+++ snip |= xs=(list A) ^- (list A)
316+ ?- xs
317+ ~ ~
318+ [item rest]
319+ ?- rest
320+ ~ ~
321+ [next more] [item (snip rest)]
330322
331323++ rear |= xs=(list A)
332324 ?- xs
333− ~ !!
334− [item rest]
335− ?- rest
336− ~ item
337− [next more] (rear rest)
325+ ~ !!
326+ [item rest]
327+ ?- rest
328+ ~ item
329+ [next more] (rear rest)
338330
339331++ cork |= gates=[$-(A B) $-(B C)]
340332 ?- gates
341− [f g] |= x=A (g (f x))
333+ [f g] |= x=A (g (f x))
342334
343335++ corl |= gates=[$-(B C) $-(A B)]
344336 ?- gates
345− [f g] |= x=A (f (g x))
337+ [f g] |= x=A (f (g x))
346338
347339++ cury |= args=[$-([A B] C) A]
348340 ?- args
349− [f a] |= b=B (f a b)
341+ [f a] |= b=B (f a b)
350342
351343++ curr |= args=[$-([A B] C) B]
352344 ?- args
353− [f b] |= a=A (f a b)
345+ [f b] |= a=A (f a b)
354346
355347+$ cmd |$ [M]
356348 [%poke p=raw-poke reply=$-((unit @t) M)]
@@ -373,29 +365,27 @@
373365 [%url reply=$-(path M)]
374366
375367:: Count a finite list with the source-backed addition gate.
376−++ lent |= xs=(list A)
377− ^- @ud
378− ?- xs
379− ~ 0
380− [item rest] (add 1 (lent rest))
368+++ lent |= xs=(list A) ^- @ud
369+ ?- xs
370+ ~ 0
371+ [item rest] (add 1 (lent rest))
381372
382373++ lth |= args=[A A]
383374 ?- args
384− [x y] (gth y x)
375+ [x y] (gth y x)
385376
386377++ gte |= args=[A A]
387378 ?- args
388− [x y] (not (gth y x))
379+ [x y] (not (gth y x))
389380
390381++ lte |= args=[A A]
391382 ?- args
392− [x y] (not (gth x y))
383+ [x y] (not (gth x y))
393384
394−++ zing |= xss=(list (list A))
395− ^- (list A)
396− ?- xss
397− ~ ~
398− [xs rest] (weld xs (zing rest))
385+++ zing |= xss=(list (list A)) ^- (list A)
386+ ?- xss
387+ ~ ~
388+ [xs rest] (weld xs (zing rest))
399389
400390++ lead |= first=A |= second=B [first second]
401391++ late |= second=B |= first=A [first second]
my-app/ui/basket.jibb+5−5
@@ -16,11 +16,11 @@
1616
1717++ update |= [=msg m=model]
1818 ?- msg
19− [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[(poke.cart %toggle |=%acked)]]
22− [%got c] [m(cart=c) ~]
23− [%acked err] [m ~]
19+ [%noted t] [m(note=t) ~]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
22+ [%got c] [m(cart=c) ~]
23+ [%acked err] [m ~]
2424
2525++ subs |= m=model
2626 ~[[%watch (state.cart |=%got)]]
my-app/ui/stores/cart.jibb+2−2
@@ -8,5 +8,5 @@
88++ init ^- state [items=~ open=%.n]
99++ update |= [a=poke s=state]
1010 ?- a
11− [%add item] s(items=[item items.s])
12− %toggle s(open=(not open.s))
11+ [%add item] s(items=[item items.s])
12+ %toggle s(open=(not open.s))
my-app/ui/todo-list.jibb+8−8
@@ -15,14 +15,14 @@
1515
1616++ update |= [=msg m=model]
1717 ?- msg
18− [%typed t]
19− ?- (gth (lent (tuba (trip t))) 80)
20− %.y [m(draft=t error=`"Too long") ~]
21− %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24− [%got ts] [m(todos=ts) ~]
25− [%acked err] [m(error=err) ~]
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
2626
2727++ subs |= m=model
2828 ~[[%watch (todos.todo |=%got)]]
tests/golden/doc-core-02-update/about.txt+1−1
@@ -1,3 +1,3 @@
11source: Core language tab, section "Example", code block 2 of the tab
2−tests: the todo island's `update` on its own, as the Core language tab quotes it: a module of one `++`; a `?-` arm with its body on the deeper lines holding a nested `?-`; changes, units, lists and constructors in arm expressions. The same text as lines 16-25 of doc-overview-10-todo-list
2+tests: the todo island's `update` on its own, as the Core language tab quotes it: a module of one `++`; a `?-` with its arms at its own depth, one arm with its body on the deeper lines holding a nested `?-` whose arms are at that `?-`'s depth; changes, units, lists and constructors in arm expressions. The same text as lines 16-25 of doc-overview-10-todo-list
33expect: parses
tests/golden/doc-core-02-update/source.jibb+8−8
@@ -1,10 +1,10 @@
11++ update |= [=msg m=model]
22 ?- msg
3− [%typed t]
4− ?- (gth (lent (tuba (trip t))) 80)
5− %.y [m(draft=t error=`"Too long") ~]
6− %.n [m(draft=t error=~) ~]
7− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
8− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
9− [%got ts] [m(todos=ts) ~]
10− [%acked err] [m(error=err) ~]
3+ [%typed t]
4+ ?- (gth (lent (tuba (trip t))) 80)
5+ %.y [m(draft=t error=`"Too long") ~]
6+ %.n [m(draft=t error=~) ~]
7+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
8+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
9+ [%got ts] [m(todos=ts) ~]
10+ [%acked err] [m(error=err) ~]
tests/golden/doc-core-02-update/tokens.txt+120−122
@@ -11,126 +11,124 @@
11112:3 INDENT
12122:3 glyph ?-
13132:6 name msg
14−3:5 INDENT
15−3:5 glyph [
16−3:6 tight lit %typed
17−3:13 name t
18−3:14 tight glyph ]
19−4:7 INDENT
20−4:7 glyph ?-
21−4:10 glyph (
22−4:11 tight name gth
23−4:15 glyph (
24−4:16 tight name lent
25−4:21 glyph (
26−4:22 tight name tuba
27−4:27 glyph (
28−4:28 tight name trip
29−4:33 name t
14+3:3 NEWLINE
15+3:3 glyph [
16+3:4 tight lit %typed
17+3:11 name t
18+3:12 tight glyph ]
19+4:5 INDENT
20+4:5 glyph ?-
21+4:8 glyph (
22+4:9 tight name gth
23+4:13 glyph (
24+4:14 tight name lent
25+4:19 glyph (
26+4:20 tight name tuba
27+4:25 glyph (
28+4:26 tight name trip
29+4:31 name t
30+4:32 tight glyph )
31+4:33 tight glyph )
30324:34 tight glyph )
31−4:35 tight glyph )
32−4:36 tight glyph )
33−4:38 lit 80
34−4:40 tight glyph )
35−5:9 INDENT
36−5:9 lit %.y
37−5:14 glyph [
38−5:15 tight name m
39−5:16 tight glyph (
40−5:17 tight name draft
41−5:22 tight glyph =
42−5:23 tight name t
43−5:25 name error
44−5:30 tight glyph =
45−5:31 tight glyph `
46−5:32 tight str "Too long"
47−5:42 tight glyph )
48−5:44 lit ~
49−5:45 tight glyph ]
50−6:9 NEWLINE
51−6:9 lit %.n
52−6:14 glyph [
53−6:15 tight name m
54−6:16 tight glyph (
55−6:17 tight name draft
56−6:22 tight glyph =
57−6:23 tight name t
58−6:25 name error
59−6:30 tight glyph =
60−6:31 tight lit ~
61−6:32 tight glyph )
62−6:34 lit ~
63−6:35 tight glyph ]
64−7:5 DEDENT
65−7:5 DEDENT
66−7:5 NEWLINE
67−7:5 lit %submit
68−7:20 glyph [
69−7:21 tight name m
70−7:22 tight glyph (
71−7:23 tight name draft
72−7:28 tight glyph =
73−7:29 tight str ""
74−7:31 tight glyph )
75−7:33 glyph ~[
76−7:35 tight glyph (
77−7:36 tight wing poke.todo
78−7:46 glyph [
79−7:47 tight lit %add
80−7:52 wing draft.m
81−7:59 tight glyph ]
82−7:61 glyph |=
83−7:63 tight lit %acked
84−7:69 tight glyph )
85−7:70 tight glyph ]
86−7:71 tight glyph ]
87−8:5 NEWLINE
88−8:5 glyph [
89−8:6 tight lit %toggled
90−8:15 name id
91−8:17 tight glyph ]
92−8:20 glyph [
93−8:21 tight name m
94−8:23 glyph ~[
95−8:25 tight glyph (
96−8:26 tight wing poke.todo
97−8:36 glyph [
98−8:37 tight lit %toggle
99−8:45 name id
100−8:47 tight glyph ]
101−8:49 glyph |=
102−8:51 tight lit %acked
103−8:57 tight glyph )
104−8:58 tight glyph ]
105−8:59 tight glyph ]
106−9:5 NEWLINE
107−9:5 glyph [
108−9:6 tight lit %got
109−9:11 name ts
110−9:13 tight glyph ]
111−9:20 glyph [
112−9:21 tight name m
113−9:22 tight glyph (
114−9:23 tight name todos
115−9:28 tight glyph =
116−9:29 tight name ts
117−9:31 tight glyph )
118−9:33 lit ~
119−9:34 tight glyph ]
120−10:5 NEWLINE
121−10:5 glyph [
122−10:6 tight lit %acked
123−10:13 name err
124−10:16 tight glyph ]
125−10:20 glyph [
126−10:21 tight name m
127−10:22 tight glyph (
128−10:23 tight name error
129−10:28 tight glyph =
130−10:29 tight name err
131−10:32 tight glyph )
132−10:34 lit ~
133−10:35 tight glyph ]
134−10:36 DEDENT
135−10:36 DEDENT
136−10:36 NEWLINE
33+4:36 lit 80
34+4:38 tight glyph )
35+5:5 NEWLINE
36+5:5 lit %.y
37+5:10 glyph [
38+5:11 tight name m
39+5:12 tight glyph (
40+5:13 tight name draft
41+5:18 tight glyph =
42+5:19 tight name t
43+5:21 name error
44+5:26 tight glyph =
45+5:27 tight glyph `
46+5:28 tight str "Too long"
47+5:38 tight glyph )
48+5:40 lit ~
49+5:41 tight glyph ]
50+6:5 NEWLINE
51+6:5 lit %.n
52+6:10 glyph [
53+6:11 tight name m
54+6:12 tight glyph (
55+6:13 tight name draft
56+6:18 tight glyph =
57+6:19 tight name t
58+6:21 name error
59+6:26 tight glyph =
60+6:27 tight lit ~
61+6:28 tight glyph )
62+6:30 lit ~
63+6:31 tight glyph ]
64+7:3 DEDENT
65+7:3 NEWLINE
66+7:3 lit %submit
67+7:18 glyph [
68+7:19 tight name m
69+7:20 tight glyph (
70+7:21 tight name draft
71+7:26 tight glyph =
72+7:27 tight str ""
73+7:29 tight glyph )
74+7:31 glyph ~[
75+7:33 tight glyph (
76+7:34 tight wing poke.todo
77+7:44 glyph [
78+7:45 tight lit %add
79+7:50 wing draft.m
80+7:57 tight glyph ]
81+7:59 glyph |=
82+7:61 tight lit %acked
83+7:67 tight glyph )
84+7:68 tight glyph ]
85+7:69 tight glyph ]
86+8:3 NEWLINE
87+8:3 glyph [
88+8:4 tight lit %toggled
89+8:13 name id
90+8:15 tight glyph ]
91+8:18 glyph [
92+8:19 tight name m
93+8:21 glyph ~[
94+8:23 tight glyph (
95+8:24 tight wing poke.todo
96+8:34 glyph [
97+8:35 tight lit %toggle
98+8:43 name id
99+8:45 tight glyph ]
100+8:47 glyph |=
101+8:49 tight lit %acked
102+8:55 tight glyph )
103+8:56 tight glyph ]
104+8:57 tight glyph ]
105+9:3 NEWLINE
106+9:3 glyph [
107+9:4 tight lit %got
108+9:9 name ts
109+9:11 tight glyph ]
110+9:18 glyph [
111+9:19 tight name m
112+9:20 tight glyph (
113+9:21 tight name todos
114+9:26 tight glyph =
115+9:27 tight name ts
116+9:29 tight glyph )
117+9:31 lit ~
118+9:32 tight glyph ]
119+10:3 NEWLINE
120+10:3 glyph [
121+10:4 tight lit %acked
122+10:11 name err
123+10:14 tight glyph ]
124+10:18 glyph [
125+10:19 tight name m
126+10:20 tight glyph (
127+10:21 tight name error
128+10:26 tight glyph =
129+10:27 tight name err
130+10:30 tight glyph )
131+10:32 lit ~
132+10:33 tight glyph ]
133+10:34 DEDENT
134+10:34 NEWLINE
tests/golden/doc-core-02-update/tree.txt+64−64
@@ -7,67 +7,67 @@
77 (body 2:3
88 (branch 2:3
99 (wing 2:6 msg)
10− (arm 3:5
11− (cell 3:5 (lit 3:6 %typed) (bind 3:13 t))
12− (body 4:7
13− (branch 4:7
14− (group 4:10
15− (call 4:11
16− (wing 4:11 gth)
17− (group 4:15
18− (call 4:16
19− (wing 4:16 lent)
20− (group 4:21
21− (call 4:22
22− (wing 4:22 tuba)
23− (group 4:27
24− (call 4:28 (wing 4:28 trip) (wing 4:33 t)))))))
25− (lit 4:38 80)))
26− (arm 5:9
27− (lit 5:9 %.y)
28− (tuple 5:14
29− (change 5:15 m
30− (edit 5:17 draft (wing 5:23 t))
31− (edit 5:25 error
32− (unit 5:31 (str 5:32 "Too long"))))
33− (lit 5:44 ~)))
34− (arm 6:9
35− (lit 6:9 %.n)
36− (tuple 6:14
37− (change 6:15 m
38− (edit 6:17 draft (wing 6:23 t))
39− (edit 6:25 error (lit 6:31 ~)))
40− (lit 6:34 ~))))))
41− (arm 7:5
42− (lit 7:5 %submit)
43− (tuple 7:20
44− (change 7:21 m
45− (edit 7:23 draft (str 7:29 "")))
46− (list 7:33
47− (group 7:35
48− (call 7:36
49− (wing 7:36 poke.todo)
50− (tuple 7:46 (lit 7:47 %add) (wing 7:52 draft.m))
51− (ctor 7:61 %acked))))))
52− (arm 8:5
53− (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
54− (tuple 8:20
55− (wing 8:21 m)
56− (list 8:23
57− (group 8:25
58− (call 8:26
59− (wing 8:26 poke.todo)
60− (tuple 8:36 (lit 8:37 %toggle) (wing 8:45 id))
61− (ctor 8:49 %acked))))))
62− (arm 9:5
63− (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
64− (tuple 9:20
65− (change 9:21 m
66− (edit 9:23 todos (wing 9:29 ts)))
67− (lit 9:33 ~)))
68− (arm 10:5
69− (cell 10:5 (lit 10:6 %acked) (bind 10:13 err))
70− (tuple 10:20
71− (change 10:21 m
72− (edit 10:23 error (wing 10:29 err)))
73− (lit 10:34 ~))))))))
10+ (arm 3:3
11+ (cell 3:3 (lit 3:4 %typed) (bind 3:11 t))
12+ (body 4:5
13+ (branch 4:5
14+ (group 4:8
15+ (call 4:9
16+ (wing 4:9 gth)
17+ (group 4:13
18+ (call 4:14
19+ (wing 4:14 lent)
20+ (group 4:19
21+ (call 4:20
22+ (wing 4:20 tuba)
23+ (group 4:25
24+ (call 4:26 (wing 4:26 trip) (wing 4:31 t)))))))
25+ (lit 4:36 80)))
26+ (arm 5:5
27+ (lit 5:5 %.y)
28+ (tuple 5:10
29+ (change 5:11 m
30+ (edit 5:13 draft (wing 5:19 t))
31+ (edit 5:21 error
32+ (unit 5:27 (str 5:28 "Too long"))))
33+ (lit 5:40 ~)))
34+ (arm 6:5
35+ (lit 6:5 %.n)
36+ (tuple 6:10
37+ (change 6:11 m
38+ (edit 6:13 draft (wing 6:19 t))
39+ (edit 6:21 error (lit 6:27 ~)))
40+ (lit 6:30 ~))))))
41+ (arm 7:3
42+ (lit 7:3 %submit)
43+ (tuple 7:18
44+ (change 7:19 m
45+ (edit 7:21 draft (str 7:27 "")))
46+ (list 7:31
47+ (group 7:33
48+ (call 7:34
49+ (wing 7:34 poke.todo)
50+ (tuple 7:44 (lit 7:45 %add) (wing 7:50 draft.m))
51+ (ctor 7:59 %acked))))))
52+ (arm 8:3
53+ (cell 8:3 (lit 8:4 %toggled) (bind 8:13 id))
54+ (tuple 8:18
55+ (wing 8:19 m)
56+ (list 8:21
57+ (group 8:23
58+ (call 8:24
59+ (wing 8:24 poke.todo)
60+ (tuple 8:34 (lit 8:35 %toggle) (wing 8:43 id))
61+ (ctor 8:47 %acked))))))
62+ (arm 9:3
63+ (cell 9:3 (lit 9:4 %got) (bind 9:9 ts))
64+ (tuple 9:18
65+ (change 9:19 m
66+ (edit 9:21 todos (wing 9:27 ts)))
67+ (lit 9:31 ~)))
68+ (arm 10:3
69+ (cell 10:3 (lit 10:4 %acked) (bind 10:11 err))
70+ (tuple 10:18
71+ (change 10:19 m
72+ (edit 10:21 error (wing 10:27 err)))
73+ (lit 10:32 ~))))))))
tests/golden/doc-grammar-04-step/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Grammar tab, section "Patterns", code block 4 of the tab
2−tests: a union `+$ step` with one case per deeper line: cells with tags at the head, in the middle and at the end, faced fields, and a bare term; a blank line between definitions; a `?-` whose arms are cell patterns mixing tags and binding names, and a bare term, with their expressions aligned by extra spaces; interpolated strings and a name as arm expressions
2+tests: a union `+$ step` with one case per deeper line: cells with tags at the head, in the middle and at the end, faced fields, and a bare term; a blank line between definitions; a `?-` whose arms, at its own depth, are cell patterns mixing tags and binding names, and a bare term, with their expressions aligned by extra spaces; interpolated strings and a name as arm expressions
33expect: parses
44expect-types: a partial inference report
tests/golden/doc-grammar-04-step/source.jibb+5−5
@@ -7,8 +7,8 @@
77
88++ describe |= s=step
99 ?- s
10− [%move %left n] "left {n}"
11− [%move %right n] "right {n}"
12− [t %draft] t
13− [t %sent sent-at] t
14− %stop "stop"
10+ [%move %left n] "left {n}"
11+ [%move %right n] "right {n}"
12+ [t %draft] t
13+ [t %sent sent-at] t
14+ %stop "stop"
tests/golden/doc-grammar-04-step/tokens.txt+36−37
@@ -46,40 +46,39 @@
46469:3 INDENT
47479:3 glyph ?-
48489:6 name s
49−10:5 INDENT
50−10:5 glyph [
51−10:6 tight lit %move
52−10:12 lit %left
53−10:18 name n
54−10:19 tight glyph ]
55−10:23 str-head "left "
56−10:30 tight name n
57−10:31 tight str-tail ""
58−11:5 NEWLINE
59−11:5 glyph [
60−11:6 tight lit %move
61−11:12 lit %right
62−11:19 name n
63−11:20 tight glyph ]
64−11:23 str-head "right "
65−11:31 tight name n
66−11:32 tight str-tail ""
67−12:5 NEWLINE
68−12:5 glyph [
69−12:6 tight name t
70−12:8 lit %draft
71−12:14 tight glyph ]
72−12:23 name t
73−13:5 NEWLINE
74−13:5 glyph [
75−13:6 tight name t
76−13:8 lit %sent
77−13:14 name sent-at
78−13:21 tight glyph ]
79−13:23 name t
80−14:5 NEWLINE
81−14:5 lit %stop
82−14:23 str "stop"
83−14:29 DEDENT
84−14:29 DEDENT
85−14:29 NEWLINE
49+10:3 NEWLINE
50+10:3 glyph [
51+10:4 tight lit %move
52+10:10 lit %left
53+10:16 name n
54+10:17 tight glyph ]
55+10:21 str-head "left "
56+10:28 tight name n
57+10:29 tight str-tail ""
58+11:3 NEWLINE
59+11:3 glyph [
60+11:4 tight lit %move
61+11:10 lit %right
62+11:17 name n
63+11:18 tight glyph ]
64+11:21 str-head "right "
65+11:29 tight name n
66+11:30 tight str-tail ""
67+12:3 NEWLINE
68+12:3 glyph [
69+12:4 tight name t
70+12:6 lit %draft
71+12:12 tight glyph ]
72+12:21 name t
73+13:3 NEWLINE
74+13:3 glyph [
75+13:4 tight name t
76+13:6 lit %sent
77+13:12 name sent-at
78+13:19 tight glyph ]
79+13:21 name t
80+14:3 NEWLINE
81+14:3 lit %stop
82+14:21 str "stop"
83+14:27 DEDENT
84+14:27 NEWLINE
tests/golden/doc-grammar-04-step/tree.txt+13−13
@@ -23,16 +23,16 @@
2323 (body 9:3
2424 (branch 9:3
2525 (wing 9:6 s)
26− (arm 10:5
27− (cell 10:5 (lit 10:6 %move) (lit 10:12 %left) (bind 10:18 n))
28− (str 10:23 "left " (wing 10:30 n)))
29− (arm 11:5
30− (cell 11:5 (lit 11:6 %move) (lit 11:12 %right) (bind 11:19 n))
31− (str 11:23 "right " (wing 11:31 n)))
32− (arm 12:5
33− (cell 12:5 (bind 12:6 t) (lit 12:8 %draft))
34− (wing 12:23 t))
35− (arm 13:5
36− (cell 13:5 (bind 13:6 t) (lit 13:8 %sent) (bind 13:14 sent-at))
37− (wing 13:23 t))
38− (arm 14:5 (lit 14:5 %stop) (str 14:23 "stop")))))))
26+ (arm 10:3
27+ (cell 10:3 (lit 10:4 %move) (lit 10:10 %left) (bind 10:16 n))
28+ (str 10:21 "left " (wing 10:28 n)))
29+ (arm 11:3
30+ (cell 11:3 (lit 11:4 %move) (lit 11:10 %right) (bind 11:17 n))
31+ (str 11:21 "right " (wing 11:29 n)))
32+ (arm 12:3
33+ (cell 12:3 (bind 12:4 t) (lit 12:6 %draft))
34+ (wing 12:21 t))
35+ (arm 13:3
36+ (cell 13:3 (bind 13:4 t) (lit 13:6 %sent) (bind 13:12 sent-at))
37+ (wing 13:21 t))
38+ (arm 14:3 (lit 14:3 %stop) (str 14:21 "stop")))))))
tests/golden/doc-grammar-06-cart-store/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Grammar tab, section "Example: a store and an island", code block 6 of the tab (block 5 is the EBNF)
2−tests: a store module: a record mold with a mold application and the loobean mold `?`; a union with its cases below; a mold that is a name; a blank line; `++ main (store init update)`; a cast with its mold and expression on one line, `^- state [~ %.n]`; a gate with a cell sample; `?-` arms whose expressions are changes, `s(items=[item items.s])` and `s(open=(not open.s))`
2+tests: a store module: a record mold with a mold application and the loobean mold `?`; a union with its cases below; a mold that is a name; a blank line; `++ main (store init update)`; a cast with its mold and expression on one line, `^- state [~ %.n]`; a gate with a cell sample; `?-` arms at the `?-`'s depth whose expressions are changes, `s(items=[item items.s])` and `s(open=(not open.s))`
33expect: parses
44expect-types: a partial inference report; store kind and declaration scope remain unresolved
tests/golden/doc-grammar-06-cart-store/tokens.txt+27−28
@@ -60,31 +60,30 @@
606010:3 INDENT
616110:3 glyph ?-
626210:6 name a
63−11:5 INDENT
64−11:5 glyph [
65−11:6 tight lit %add
66−11:11 name item
67−11:15 tight glyph ]
68−11:18 name s
69−11:19 tight glyph (
70−11:20 tight name items
71−11:25 tight glyph =
72−11:26 tight glyph [
73−11:27 tight name item
74−11:32 wing items.s
75−11:39 tight glyph ]
76−11:40 tight glyph )
77−12:5 NEWLINE
78−12:5 lit %toggle
79−12:18 name s
80−12:19 tight glyph (
81−12:20 tight name open
82−12:24 tight glyph =
83−12:25 tight glyph (
84−12:26 tight name not
85−12:30 wing open.s
86−12:36 tight glyph )
87−12:37 tight glyph )
88−12:38 DEDENT
89−12:38 DEDENT
90−12:38 NEWLINE
63+11:3 NEWLINE
64+11:3 glyph [
65+11:4 tight lit %add
66+11:9 name item
67+11:13 tight glyph ]
68+11:16 name s
69+11:17 tight glyph (
70+11:18 tight name items
71+11:23 tight glyph =
72+11:24 tight glyph [
73+11:25 tight name item
74+11:30 wing items.s
75+11:37 tight glyph ]
76+11:38 tight glyph )
77+12:3 NEWLINE
78+12:3 lit %toggle
79+12:16 name s
80+12:17 tight glyph (
81+12:18 tight name open
82+12:22 tight glyph =
83+12:23 tight glyph (
84+12:24 tight name not
85+12:28 wing open.s
86+12:34 tight glyph )
87+12:35 tight glyph )
88+12:36 DEDENT
89+12:36 NEWLINE
tests/golden/doc-grammar-06-cart-store/tree.txt+11−11
@@ -27,14 +27,14 @@
2727 (body 10:3
2828 (branch 10:3
2929 (wing 10:6 a)
30− (arm 11:5
31− (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
32− (change 11:18 s
33− (edit 11:20 items
34− (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
35− (arm 12:5
36− (lit 12:5 %toggle)
37− (change 12:18 s
38− (edit 12:20 open
39− (group 12:25
40− (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
30+ (arm 11:3
31+ (cell 11:3 (lit 11:4 %add) (bind 11:9 item))
32+ (change 11:16 s
33+ (edit 11:18 items
34+ (tuple 11:24 (wing 11:25 item) (wing 11:30 items.s)))))
35+ (arm 12:3
36+ (lit 12:3 %toggle)
37+ (change 12:16 s
38+ (edit 12:18 open
39+ (group 12:23
40+ (call 12:24 (wing 12:24 not) (wing 12:28 open.s)))))))))))
tests/golden/doc-grammar-07-basket/about.txt+1−1
@@ -1,3 +1,3 @@
11source: Grammar tab, section "Example: a store and an island", code block 7 of the tab
2−tests: an island module: a `/=` import; blank lines between definitions; a record mold holding a wing mold `state.cart`; a union with term, faced-cell and mold-application cases; `|= ~` with its body below; a pun sample `=msg`; arms whose expressions are cells holding changes (`m(note="")`), lists of cells, parenthesised calls of wings and constructors (`|=%acked`); `(state.cart |=%got)`; a list left open at the end of its line whose items are a parenthesised call with an interpolated group `{(lent items.cart.m)}` and two unparenthesised calls, one ending in `|=%noted`
2+tests: an island module: a `/=` import; blank lines between definitions; a record mold holding a wing mold `state.cart`; a union with term, faced-cell and mold-application cases; `|= ~` with its body below; a pun sample `=msg`; arms at the `?-`'s depth whose expressions are cells holding changes (`m(note="")`), lists of cells, parenthesised calls of wings and constructors (`|=%acked`); `(state.cart |=%got)`; a list left open at the end of its line whose items are a parenthesised call with an interpolated group `{(lent items.cart.m)}` and two unparenthesised calls, one ending in `|=%noted`
33expect: parses
tests/golden/doc-grammar-07-basket/tokens.txt+71−72
@@ -95,78 +95,77 @@
959518:3 INDENT
969618:3 glyph ?-
979718:6 name msg
98−19:5 INDENT
99−19:5 glyph [
100−19:6 tight lit %noted
101−19:13 name t
102−19:14 tight glyph ]
103−19:20 glyph [
104−19:21 tight name m
105−19:22 tight glyph (
106−19:23 tight name note
107−19:27 tight glyph =
108−19:28 tight name t
109−19:29 tight glyph )
110−19:31 lit ~
111−19:32 tight glyph ]
112−20:5 NEWLINE
113−20:5 lit %add
114−20:20 glyph [
115−20:21 tight name m
116−20:22 tight glyph (
117−20:23 tight name note
118−20:27 tight glyph =
119−20:28 tight str ""
120−20:30 tight glyph )
121−20:32 glyph ~[
122−20:34 tight glyph (
123−20:35 tight wing poke.cart
124−20:45 glyph [
125−20:46 tight lit %add
126−20:51 wing note.m
127−20:57 tight glyph ]
128−20:59 glyph |=
129−20:61 tight lit %acked
130−20:67 tight glyph )
131−20:68 tight glyph ]
132−20:69 tight glyph ]
133−21:5 NEWLINE
134−21:5 lit %toggle
135−21:20 glyph [
136−21:21 tight name m
137−21:23 glyph ~[
138−21:25 tight glyph (
139−21:26 tight wing poke.cart
140−21:36 lit %toggle
141−21:44 glyph |=
142−21:46 tight lit %acked
143−21:52 tight glyph )
144−21:53 tight glyph ]
145−21:54 tight glyph ]
146−22:5 NEWLINE
147−22:5 glyph [
148−22:6 tight lit %got
149−22:11 name c
150−22:12 tight glyph ]
151−22:20 glyph [
152−22:21 tight name m
153−22:22 tight glyph (
154−22:23 tight name cart
155−22:27 tight glyph =
156−22:28 tight name c
157−22:29 tight glyph )
158−22:31 lit ~
159−22:32 tight glyph ]
160−23:5 NEWLINE
161−23:5 glyph [
162−23:6 tight lit %acked
163−23:13 name err
164−23:16 tight glyph ]
165−23:20 glyph [
166−23:21 tight name m
167−23:23 lit ~
168−23:24 tight glyph ]
169−25:1 DEDENT
98+19:3 NEWLINE
99+19:3 glyph [
100+19:4 tight lit %noted
101+19:11 name t
102+19:12 tight glyph ]
103+19:18 glyph [
104+19:19 tight name m
105+19:20 tight glyph (
106+19:21 tight name note
107+19:25 tight glyph =
108+19:26 tight name t
109+19:27 tight glyph )
110+19:29 lit ~
111+19:30 tight glyph ]
112+20:3 NEWLINE
113+20:3 lit %add
114+20:18 glyph [
115+20:19 tight name m
116+20:20 tight glyph (
117+20:21 tight name note
118+20:25 tight glyph =
119+20:26 tight str ""
120+20:28 tight glyph )
121+20:30 glyph ~[
122+20:32 tight glyph (
123+20:33 tight wing poke.cart
124+20:43 glyph [
125+20:44 tight lit %add
126+20:49 wing note.m
127+20:55 tight glyph ]
128+20:57 glyph |=
129+20:59 tight lit %acked
130+20:65 tight glyph )
131+20:66 tight glyph ]
132+20:67 tight glyph ]
133+21:3 NEWLINE
134+21:3 lit %toggle
135+21:18 glyph [
136+21:19 tight name m
137+21:21 glyph ~[
138+21:23 tight glyph (
139+21:24 tight wing poke.cart
140+21:34 lit %toggle
141+21:42 glyph |=
142+21:44 tight lit %acked
143+21:50 tight glyph )
144+21:51 tight glyph ]
145+21:52 tight glyph ]
146+22:3 NEWLINE
147+22:3 glyph [
148+22:4 tight lit %got
149+22:9 name c
150+22:10 tight glyph ]
151+22:18 glyph [
152+22:19 tight name m
153+22:20 tight glyph (
154+22:21 tight name cart
155+22:25 tight glyph =
156+22:26 tight name c
157+22:27 tight glyph )
158+22:29 lit ~
159+22:30 tight glyph ]
160+23:3 NEWLINE
161+23:3 glyph [
162+23:4 tight lit %acked
163+23:11 name err
164+23:14 tight glyph ]
165+23:18 glyph [
166+23:19 tight name m
167+23:21 lit ~
168+23:22 tight glyph ]
17016925:1 DEDENT
17117025:1 NEWLINE
17217125:1 glyph ++
tests/golden/doc-grammar-07-basket/tree.txt+33−33
@@ -39,39 +39,39 @@
3939 (body 18:3
4040 (branch 18:3
4141 (wing 18:6 msg)
42− (arm 19:5
43− (cell 19:5 (lit 19:6 %noted) (bind 19:13 t))
44− (tuple 19:20
45− (change 19:21 m
46− (edit 19:23 note (wing 19:28 t)))
47− (lit 19:31 ~)))
48− (arm 20:5
49− (lit 20:5 %add)
50− (tuple 20:20
51− (change 20:21 m
52− (edit 20:23 note (str 20:28 "")))
53− (list 20:32
54− (group 20:34
55− (call 20:35
56− (wing 20:35 poke.cart)
57− (tuple 20:45 (lit 20:46 %add) (wing 20:51 note.m))
58− (ctor 20:59 %acked))))))
59− (arm 21:5
60− (lit 21:5 %toggle)
61− (tuple 21:20
62− (wing 21:21 m)
63− (list 21:23
64− (group 21:25
65− (call 21:26 (wing 21:26 poke.cart) (lit 21:36 %toggle) (ctor 21:44 %acked))))))
66− (arm 22:5
67− (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
68− (tuple 22:20
69− (change 22:21 m
70− (edit 22:23 cart (wing 22:28 c)))
71− (lit 22:31 ~)))
72− (arm 23:5
73− (cell 23:5 (lit 23:6 %acked) (bind 23:13 err))
74− (tuple 23:20 (wing 23:21 m) (lit 23:23 ~)))))))
42+ (arm 19:3
43+ (cell 19:3 (lit 19:4 %noted) (bind 19:11 t))
44+ (tuple 19:18
45+ (change 19:19 m
46+ (edit 19:21 note (wing 19:26 t)))
47+ (lit 19:29 ~)))
48+ (arm 20:3
49+ (lit 20:3 %add)
50+ (tuple 20:18
51+ (change 20:19 m
52+ (edit 20:21 note (str 20:26 "")))
53+ (list 20:30
54+ (group 20:32
55+ (call 20:33
56+ (wing 20:33 poke.cart)
57+ (tuple 20:43 (lit 20:44 %add) (wing 20:49 note.m))
58+ (ctor 20:57 %acked))))))
59+ (arm 21:3
60+ (lit 21:3 %toggle)
61+ (tuple 21:18
62+ (wing 21:19 m)
63+ (list 21:21
64+ (group 21:23
65+ (call 21:24 (wing 21:24 poke.cart) (lit 21:34 %toggle) (ctor 21:42 %acked))))))
66+ (arm 22:3
67+ (cell 22:3 (lit 22:4 %got) (bind 22:9 c))
68+ (tuple 22:18
69+ (change 22:19 m
70+ (edit 22:21 cart (wing 22:26 c)))
71+ (lit 22:29 ~)))
72+ (arm 23:3
73+ (cell 23:3 (lit 23:4 %acked) (bind 23:11 err))
74+ (tuple 23:18 (wing 23:19 m) (lit 23:21 ~)))))))
7575 (value 25:1 subs
7676 (gate 25:9
7777 (face 25:12 m (ref 25:14 model))
tests/golden/doc-overview-10-todo-list/about.txt+1−1
@@ -1,3 +1,3 @@
11source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), section "Worked examples", 3. Interactive: /ui/todo-list.jibb, code block 10 of the tab
2−tests: the interactive island: a record mold with mold applications; a five-case union; a gate with its body below; a `?-` arm whose body is on the deeper lines, a nested `?-` on a deeply nested call with loobean arms; changes holding a unit of a string (`` error=`"Too long" ``) and a null; arms aligned with extra spaces; lists of cells holding constructors; a list left open inside another open list (`row ~[gap+%s1] ~[`); a pair whose operand is a cell; calls ending in `|=%typed`; a gate whose body is a cell holding a call with a cell argument
2+tests: the interactive island: a record mold with mold applications; a five-case union; a gate with its body below; a `?-` with its arms at its own depth, one arm's body on the deeper lines, a nested `?-` on a deeply nested call with loobean arms at its depth; changes holding a unit of a string (`` error=`"Too long" ``) and a null; arms aligned with extra spaces; lists of cells holding constructors; a list left open inside another open list (`row ~[gap+%s1] ~[`); a pair whose operand is a cell; calls ending in `|=%typed`; a gate whose body is a cell holding a call with a cell argument
33expect: parses
tests/golden/doc-overview-10-todo-list/tokens.txt+118−120
@@ -113,127 +113,125 @@
11311317:3 INDENT
11411417:3 glyph ?-
11511517:6 name msg
116−18:5 INDENT
117−18:5 glyph [
118−18:6 tight lit %typed
119−18:13 name t
120−18:14 tight glyph ]
121−19:7 INDENT
122−19:7 glyph ?-
123−19:10 glyph (
124−19:11 tight name gth
125−19:15 glyph (
126−19:16 tight name lent
127−19:21 glyph (
128−19:22 tight name tuba
129−19:27 glyph (
130−19:28 tight name trip
131−19:33 name t
116+18:3 NEWLINE
117+18:3 glyph [
118+18:4 tight lit %typed
119+18:11 name t
120+18:12 tight glyph ]
121+19:5 INDENT
122+19:5 glyph ?-
123+19:8 glyph (
124+19:9 tight name gth
125+19:13 glyph (
126+19:14 tight name lent
127+19:19 glyph (
128+19:20 tight name tuba
129+19:25 glyph (
130+19:26 tight name trip
131+19:31 name t
132+19:32 tight glyph )
133+19:33 tight glyph )
13213419:34 tight glyph )
133−19:35 tight glyph )
134−19:36 tight glyph )
135−19:38 lit 80
136−19:40 tight glyph )
137−20:9 INDENT
138−20:9 lit %.y
139−20:14 glyph [
140−20:15 tight name m
141−20:16 tight glyph (
142−20:17 tight name draft
143−20:22 tight glyph =
144−20:23 tight name t
145−20:25 name error
146−20:30 tight glyph =
147−20:31 tight glyph `
148−20:32 tight str "Too long"
149−20:42 tight glyph )
150−20:44 lit ~
151−20:45 tight glyph ]
152−21:9 NEWLINE
153−21:9 lit %.n
154−21:14 glyph [
155−21:15 tight name m
156−21:16 tight glyph (
157−21:17 tight name draft
158−21:22 tight glyph =
159−21:23 tight name t
160−21:25 name error
161−21:30 tight glyph =
162−21:31 tight lit ~
163−21:32 tight glyph )
164−21:34 lit ~
165−21:35 tight glyph ]
166−22:5 DEDENT
167−22:5 DEDENT
168−22:5 NEWLINE
169−22:5 lit %submit
170−22:20 glyph [
171−22:21 tight name m
172−22:22 tight glyph (
173−22:23 tight name draft
174−22:28 tight glyph =
175−22:29 tight str ""
176−22:31 tight glyph )
177−22:33 glyph ~[
178−22:35 tight glyph (
179−22:36 tight wing poke.todo
180−22:46 glyph [
181−22:47 tight lit %add
182−22:52 wing draft.m
183−22:59 tight glyph ]
184−22:61 glyph |=
185−22:63 tight lit %acked
186−22:69 tight glyph )
187−22:70 tight glyph ]
188−22:71 tight glyph ]
189−23:5 NEWLINE
190−23:5 glyph [
191−23:6 tight lit %toggled
192−23:15 name id
193−23:17 tight glyph ]
194−23:20 glyph [
195−23:21 tight name m
196−23:23 glyph ~[
197−23:25 tight glyph (
198−23:26 tight wing poke.todo
199−23:36 glyph [
200−23:37 tight lit %toggle
201−23:45 name id
202−23:47 tight glyph ]
203−23:49 glyph |=
204−23:51 tight lit %acked
205−23:57 tight glyph )
206−23:58 tight glyph ]
207−23:59 tight glyph ]
208−24:5 NEWLINE
209−24:5 glyph [
210−24:6 tight lit %got
211−24:11 name ts
212−24:13 tight glyph ]
213−24:20 glyph [
214−24:21 tight name m
215−24:22 tight glyph (
216−24:23 tight name todos
217−24:28 tight glyph =
218−24:29 tight name ts
219−24:31 tight glyph )
220−24:33 lit ~
221−24:34 tight glyph ]
222−25:5 NEWLINE
223−25:5 glyph [
224−25:6 tight lit %acked
225−25:13 name err
226−25:16 tight glyph ]
227−25:20 glyph [
228−25:21 tight name m
229−25:22 tight glyph (
230−25:23 tight name error
231−25:28 tight glyph =
232−25:29 tight name err
233−25:32 tight glyph )
234−25:34 lit ~
235−25:35 tight glyph ]
236−27:1 DEDENT
135+19:36 lit 80
136+19:38 tight glyph )
137+20:5 NEWLINE
138+20:5 lit %.y
139+20:10 glyph [
140+20:11 tight name m
141+20:12 tight glyph (
142+20:13 tight name draft
143+20:18 tight glyph =
144+20:19 tight name t
145+20:21 name error
146+20:26 tight glyph =
147+20:27 tight glyph `
148+20:28 tight str "Too long"
149+20:38 tight glyph )
150+20:40 lit ~
151+20:41 tight glyph ]
152+21:5 NEWLINE
153+21:5 lit %.n
154+21:10 glyph [
155+21:11 tight name m
156+21:12 tight glyph (
157+21:13 tight name draft
158+21:18 tight glyph =
159+21:19 tight name t
160+21:21 name error
161+21:26 tight glyph =
162+21:27 tight lit ~
163+21:28 tight glyph )
164+21:30 lit ~
165+21:31 tight glyph ]
166+22:3 DEDENT
167+22:3 NEWLINE
168+22:3 lit %submit
169+22:18 glyph [
170+22:19 tight name m
171+22:20 tight glyph (
172+22:21 tight name draft
173+22:26 tight glyph =
174+22:27 tight str ""
175+22:29 tight glyph )
176+22:31 glyph ~[
177+22:33 tight glyph (
178+22:34 tight wing poke.todo
179+22:44 glyph [
180+22:45 tight lit %add
181+22:50 wing draft.m
182+22:57 tight glyph ]
183+22:59 glyph |=
184+22:61 tight lit %acked
185+22:67 tight glyph )
186+22:68 tight glyph ]
187+22:69 tight glyph ]
188+23:3 NEWLINE
189+23:3 glyph [
190+23:4 tight lit %toggled
191+23:13 name id
192+23:15 tight glyph ]
193+23:18 glyph [
194+23:19 tight name m
195+23:21 glyph ~[
196+23:23 tight glyph (
197+23:24 tight wing poke.todo
198+23:34 glyph [
199+23:35 tight lit %toggle
200+23:43 name id
201+23:45 tight glyph ]
202+23:47 glyph |=
203+23:49 tight lit %acked
204+23:55 tight glyph )
205+23:56 tight glyph ]
206+23:57 tight glyph ]
207+24:3 NEWLINE
208+24:3 glyph [
209+24:4 tight lit %got
210+24:9 name ts
211+24:11 tight glyph ]
212+24:18 glyph [
213+24:19 tight name m
214+24:20 tight glyph (
215+24:21 tight name todos
216+24:26 tight glyph =
217+24:27 tight name ts
218+24:29 tight glyph )
219+24:31 lit ~
220+24:32 tight glyph ]
221+25:3 NEWLINE
222+25:3 glyph [
223+25:4 tight lit %acked
224+25:11 name err
225+25:14 tight glyph ]
226+25:18 glyph [
227+25:19 tight name m
228+25:20 tight glyph (
229+25:21 tight name error
230+25:26 tight glyph =
231+25:27 tight name err
232+25:30 tight glyph )
233+25:32 lit ~
234+25:33 tight glyph ]
23723527:1 DEDENT
23823627:1 NEWLINE
23923727:1 glyph ++
tests/golden/doc-overview-10-todo-list/tree.txt+64−64
@@ -44,70 +44,70 @@
4444 (body 17:3
4545 (branch 17:3
4646 (wing 17:6 msg)
47− (arm 18:5
48− (cell 18:5 (lit 18:6 %typed) (bind 18:13 t))
49− (body 19:7
50− (branch 19:7
51− (group 19:10
52− (call 19:11
53− (wing 19:11 gth)
54− (group 19:15
55− (call 19:16
56− (wing 19:16 lent)
57− (group 19:21
58− (call 19:22
59− (wing 19:22 tuba)
60− (group 19:27
61− (call 19:28 (wing 19:28 trip) (wing 19:33 t)))))))
62− (lit 19:38 80)))
63− (arm 20:9
64− (lit 20:9 %.y)
65− (tuple 20:14
66− (change 20:15 m
67− (edit 20:17 draft (wing 20:23 t))
68− (edit 20:25 error
69− (unit 20:31 (str 20:32 "Too long"))))
70− (lit 20:44 ~)))
71− (arm 21:9
72− (lit 21:9 %.n)
73− (tuple 21:14
74− (change 21:15 m
75− (edit 21:17 draft (wing 21:23 t))
76− (edit 21:25 error (lit 21:31 ~)))
77− (lit 21:34 ~))))))
78− (arm 22:5
79− (lit 22:5 %submit)
80− (tuple 22:20
81− (change 22:21 m
82− (edit 22:23 draft (str 22:29 "")))
83− (list 22:33
84− (group 22:35
85− (call 22:36
86− (wing 22:36 poke.todo)
87− (tuple 22:46 (lit 22:47 %add) (wing 22:52 draft.m))
88− (ctor 22:61 %acked))))))
89− (arm 23:5
90− (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
91− (tuple 23:20
92− (wing 23:21 m)
93− (list 23:23
94− (group 23:25
95− (call 23:26
96− (wing 23:26 poke.todo)
97− (tuple 23:36 (lit 23:37 %toggle) (wing 23:45 id))
98− (ctor 23:49 %acked))))))
99− (arm 24:5
100− (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
101− (tuple 24:20
102− (change 24:21 m
103− (edit 24:23 todos (wing 24:29 ts)))
104− (lit 24:33 ~)))
105− (arm 25:5
106− (cell 25:5 (lit 25:6 %acked) (bind 25:13 err))
107− (tuple 25:20
108− (change 25:21 m
109− (edit 25:23 error (wing 25:29 err)))
110− (lit 25:34 ~)))))))
47+ (arm 18:3
48+ (cell 18:3 (lit 18:4 %typed) (bind 18:11 t))
49+ (body 19:5
50+ (branch 19:5
51+ (group 19:8
52+ (call 19:9
53+ (wing 19:9 gth)
54+ (group 19:13
55+ (call 19:14
56+ (wing 19:14 lent)
57+ (group 19:19
58+ (call 19:20
59+ (wing 19:20 tuba)
60+ (group 19:25
61+ (call 19:26 (wing 19:26 trip) (wing 19:31 t)))))))
62+ (lit 19:36 80)))
63+ (arm 20:5
64+ (lit 20:5 %.y)
65+ (tuple 20:10
66+ (change 20:11 m
67+ (edit 20:13 draft (wing 20:19 t))
68+ (edit 20:21 error
69+ (unit 20:27 (str 20:28 "Too long"))))
70+ (lit 20:40 ~)))
71+ (arm 21:5
72+ (lit 21:5 %.n)
73+ (tuple 21:10
74+ (change 21:11 m
75+ (edit 21:13 draft (wing 21:19 t))
76+ (edit 21:21 error (lit 21:27 ~)))
77+ (lit 21:30 ~))))))
78+ (arm 22:3
79+ (lit 22:3 %submit)
80+ (tuple 22:18
81+ (change 22:19 m
82+ (edit 22:21 draft (str 22:27 "")))
83+ (list 22:31
84+ (group 22:33
85+ (call 22:34
86+ (wing 22:34 poke.todo)
87+ (tuple 22:44 (lit 22:45 %add) (wing 22:50 draft.m))
88+ (ctor 22:59 %acked))))))
89+ (arm 23:3
90+ (cell 23:3 (lit 23:4 %toggled) (bind 23:13 id))
91+ (tuple 23:18
92+ (wing 23:19 m)
93+ (list 23:21
94+ (group 23:23
95+ (call 23:24
96+ (wing 23:24 poke.todo)
97+ (tuple 23:34 (lit 23:35 %toggle) (wing 23:43 id))
98+ (ctor 23:47 %acked))))))
99+ (arm 24:3
100+ (cell 24:3 (lit 24:4 %got) (bind 24:9 ts))
101+ (tuple 24:18
102+ (change 24:19 m
103+ (edit 24:21 todos (wing 24:27 ts)))
104+ (lit 24:31 ~)))
105+ (arm 25:3
106+ (cell 25:3 (lit 25:4 %acked) (bind 25:11 err))
107+ (tuple 25:18
108+ (change 25:19 m
109+ (edit 25:21 error (wing 25:27 err)))
110+ (lit 25:32 ~)))))))
111111 (value 27:1 subs
112112 (gate 27:9
113113 (face 27:12 m (ref 27:14 model))