on master help sign in
Expose transparent poke from internal prelude
c790a9fiko
README.md+1−1
@@ -42,7 +42,7 @@ tools/hoon '(golden /a/b/jibb (crip "++ main view"))'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
43```
43```
44
44
45−`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-tlon-test` and `tools/type-mark-test` check the importer/checker bridges under eval; the ship suite runs the same fixtures.
45+`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-tlon-test`, `tools/type-mark-test` and `tools/type-poke-test` check importer/checker and prelude boundaries under eval; the ship suite runs the same fixtures.
46
46
47### The doc's examples
47### The doc's examples
48
48
docs/compiler.md+2−2
@@ -64,7 +64,7 @@ String interpolation infers its pieces in order and preserves substitutions and
64
64
65A bare tag that provably matches no case of a known union reports the union and tag sites. This covers casts, single-argument calls, contextual unit payloads, list items and supported branch arms, including unnamed imported unions. For syntactic tuples, ordered fit replay can identify a missing tag in a nested position; an earlier mismatch or uncertainty stops the replay instead of guessing. Existing tags whose shape or payload does not fit retain the ordinary mismatch; unresolved tags stay pending.
65A bare tag that provably matches no case of a known union reports the union and tag sites. This covers casts, single-argument calls, contextual unit payloads, list items and supported branch arms, including unnamed imported unions. For syntactic tuples, ordered fit replay can identify a missing tag in a nested position; an earlier mismatch or uncertainty stops the replay instead of guessing. Existing tags whose shape or payload does not fit retain the ordinary mismatch; unresolved tags stay pending.
66
66
67−A change can replace uniquely named fields on a fully known, faced record spine, including through a nested wing. Replacements receive the field type as context, substitutions and pending constraints are retained, and the resulting type remains the original record. Missing fields, empty changes and definite replacement mismatches report sites; the expected-type site is the edit, since the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A cast to a known record also supplies field context to a tuple or record initializer, including nested list and union fields. The expected-type site is the cast mold; the original field declaration location is not retained. The cart-store example’s `init` and `update` infer in this fragment; store kind and declaration checking remain unfinished.
67+A change can replace uniquely named fields on a fully known, faced record spine, including through a nested wing. Replacements receive the field type as context, substitutions and pending constraints are retained, and the resulting type remains the original record. Missing fields, empty changes and definite replacement mismatches report sites; the expected-type site is the edit, since the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A cast to a known record also supplies field context to a tuple or record initializer, including nested list and union fields. The expected-type site is the cast mold; the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer in this fragment. The complete cart-store source fails closed because store kind and declaration scope are not yet checked.
68
68
69For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
69For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
70
70
@@ -88,7 +88,7 @@ Callers that have a `/sur` core and a name can use `+read-named`: it checks for
88
88
89`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes, direct generic unions, and simple or nonrecursive generic mold aliases whose bodies the fragment supports. It detects missing sources and cycles and rejects a dependency if its interface cannot be inferred by the fragment.
89`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes, direct generic unions, and simple or nonrecursive generic mold aliases whose bodies the fragment supports. It detects missing sources and cycles and rejects a dependency if its interface cannot be inferred by the fragment.
90
90
91−The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, `same`, `fall`, `need`, `lure`, `weld`, `snoc` and `turn`; unsupported entries, such as most list helpers, remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. List-dependent prelude mold aliases remain unsupported because their templates are prepared before this injection. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. Prelude imports, including the planned private internal module, are not supported by preparation. The shared module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship.
91+The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, `same`, `fall`, `need`, `lure`, `weld`, `snoc` and `turn`; unsupported entries, such as most list helpers, remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. List-dependent prelude mold aliases remain unsupported because their templates are prepared before this injection. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. The source-backed internal prelude defines `poke`, which the public prelude re-exports as an ordinary transparent type. The partial checker resolves its supported source shape, preserves its public name, and rejects ordinary imports of the private internal path. An imported API with one mark and a matching direct `+$ poke` declaration can export a derived constructor and retain agent/mark metadata when the source representation has the supported agent case. Other API shapes, complete private module checking, root API and kind checking, stores, `ask`, `pure`, lowering and runtime effects remain unfinished. A possible store or root API declaring `+$ poke` reports that kind or scope needs unsupported inference; definite duplicate declarations and unrelated shadowing still report conflicts. Prepared interfaces and caches are trusted caller inputs; the future host and linker must ensure the private source validated during preparation is the same version used to lower derived constructors. Opaque payloads may contain gates, so the fragment treats them conservatively; full gate-free checks are unfinished. General widening to `*` and noun patterns must preserve sealing when they are implemented. The shared module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship.
92
92
93`+prepare-prelude` derives the interface and declared-name inventory from the trusted vendored source. Hosts can reuse its result with `+golden-types-with-prepared-prelude`; they must pass the unchanged result of preparation, not an independently constructed value. Empty, malformed, duplicate-name or import-bearing prelude sources fail closed. `+golden-types-with-prelude` remains the source-taking wrapper. API files, modules with `main`, unsupported definitions and many other features remain outside this subset. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. None of these partial reports claims the module has been checked.
93`+prepare-prelude` derives the interface and declared-name inventory from the trusted vendored source. Hosts can reuse its result with `+golden-types-with-prepared-prelude`; they must pass the unchanged result of preparation, not an independently constructed value. Empty, malformed, duplicate-name or import-bearing prelude sources fail closed. `+golden-types-with-prelude` remains the source-taking wrapper. API files, modules with `main`, unsupported definitions and many other features remain outside this subset. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. None of these partial reports claims the module has been checked.
94
94
docs/development.md+4−2
@@ -64,6 +64,7 @@ git clone https://github.com/urbit/tools /root/src/tools
64| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
64| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
65| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
65| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
66| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
66| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
67+| `tools/type-poke-test` | Checks source-backed prelude and poke-only API reports against `tests/type-poke/expected.txt` under eval |
67| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
68| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
68| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
69| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
69| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
70| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
@@ -83,6 +84,7 @@ tools/type-import-test # importer/checker bridge golden report match
83tools/type-tlon-test # real Tlon importer/checker report matches
84tools/type-tlon-test # real Tlon importer/checker report matches
84tools/type-import-diagnostic-test # direct structured reader diagnostics match
85tools/type-import-diagnostic-test # direct structured reader diagnostics match
85tools/type-mark-test # mark/checker bridge golden report matches
86tools/type-mark-test # mark/checker bridge golden report matches
87+tools/type-poke-test # source-backed poke/API bridge report matches
86tools/type-module-scope-test # module/prelude scope golden report matches
88tools/type-module-scope-test # module/prelude scope golden report matches
87tools/hoon check-spans-test # prints <<>>
89tools/hoon check-spans-test # prints <<>>
88tools/testdata/selftest # 22 checks, 0 failed
90tools/testdata/selftest # 22 checks, 0 failed
@@ -94,7 +96,7 @@ tools/ship check-commit # when the mark or the desks changed
94tools/clay-fixtures # when the my-app Hoon fixtures or importer changed
96tools/clay-fixtures # when the my-app Hoon fixtures or importer changed
95```
97```
96
98
97−`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. `tests/lib/jibb-tlon-bridge.hoon` and `tools/type-tlon-test` run the real Tlon presence reader/checker fixture on both. The structured reader diagnostics have their own `tests/lib/jibb-import-diagnostic.hoon` ship test and `tools/type-import-diagnostic-test` eval test. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report. `tests/lib/jibb-module-scope.hoon` and `tools/type-module-scope-test` compare the prelude scope report on the ship and under eval.
99+`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. `tests/lib/jibb-tlon-bridge.hoon` and `tools/type-tlon-test` run the real Tlon presence reader/checker fixture on both. The structured reader diagnostics have their own `tests/lib/jibb-import-diagnostic.hoon` ship test and `tools/type-import-diagnostic-test` eval test. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report. `tests/lib/jibb-poke-bridge.hoon` and `tools/type-poke-test` share the source-backed prelude and poke-only API fixture. `tests/lib/jibb-module-scope.hoon` and `tools/type-module-scope-test` compare the prelude scope report on the ship and under eval.
98
100
99## Golden cases
101## Golden cases
100
102
@@ -108,7 +110,7 @@ A case is a folder `tests/golden/<name>/` holding:
108- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
110- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
109- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources and the vendored prelude to the partial module checker. The file opts in even when it lists no sources; use a comment such as `# no module fixtures` for an empty bundle, since zero-byte `%txt` fixtures do not sync reliably on the ship. Blank lines and comment lines are ignored. Cases without `modules.txt` keep their existing no-prelude type interface.
111- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources and the vendored prelude to the partial module checker. The file opts in even when it lists no sources; use a comment such as `# no module fixtures` for an empty bundle, since zero-byte `%txt` fixtures do not sync reliably on the ship. Blank lines and comment lines are ignored. Cases without `modules.txt` keep their existing no-prelude type interface.
110
112
111−The runners prepare the trusted vendored prelude once for their generated test core and share its partial interface. Preparation reserves all names present in that source and supplies the molds and values the fragment can infer; an unsupported declaration remains reserved but unavailable. The source and the checker are incomplete, so the output still says the module has not been checked and does not claim complete shadowing coverage. `+golden-types-with-prelude` accepts source directly; callers using `+golden-types-with-prepared-prelude` must pass the unchanged result of `+prepare-prelude`. Missing, malformed or conflicting source fails closed, and prelude imports are not supported yet.
113+The runners prepare the trusted vendored public and internal prelude sources once for their generated test core and share the partial interface. Preparation reserves all names present in the public source and supplies the molds and values the fragment can infer; an unsupported declaration remains reserved but unavailable. The source and checker are incomplete, so the output still says the module has not been checked and does not claim complete shadowing coverage. `+golden-types-with-prelude-and-internal` accepts both sources directly; callers using `+golden-types-with-prepared-prelude` pass the unchanged result of `+prepare-prelude-with-internal`. The older source-only entry points remain available for preludes without imports. Missing or malformed sources fail closed.
112
114
113A zero-byte mark fixture currently fails ship synchronization validation after commit. Use a newline-only fixture to test an empty Hoon source on the ship.
115A zero-byte mark fixture currently fails ship synchronization validation after commit. Use a newline-only fixture to test an empty Hoon source on the ship.
114
116
docs/open-questions.md+1−1
@@ -44,7 +44,7 @@ Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking i
4422. **Settled: overlapping imported `$%` and `$?` cases.** On 2026-10-30, @iko confirmed that the general union disjointness rule rejects imported `$%` and `$?` cases that overlap as nouns where the type is used, as it does for `$^`. The importer rejects recognizable overlaps and fails closed when it cannot verify them.
4422. **Settled: overlapping imported `$%` and `$?` cases.** On 2026-10-30, @iko confirmed that the general union disjointness rule rejects imported `$%` and `$?` cases that overlap as nouns where the type is used, as it does for `$^`. The importer rejects recognizable overlaps and fails closed when it cannot verify them.
4523. **Settled: converging explicit capitals.** On 2026-10-30, @iko chose that a body cannot force two separately written capitals to be equal. For `++ repeated |= x=(choice A A) x`, `++ f |= x=(choice A B) (repeated x)` is an error; use `A` in both positions when the type must be shared. This also applies across local captures and within generic mold applications.
4523. **Settled: converging explicit capitals.** On 2026-10-30, @iko chose that a body cannot force two separately written capitals to be equal. For `++ repeated |= x=(choice A A) x`, `++ f |= x=(choice A B) (repeated x)` is an error; use `A` in both positions when the type must be shared. This also applies across local captures and within generic mold applications.
46
46
47−24. **Settled: how the internal prelude provides `poke`.** On 2026-10-31, @iko chose to define `poke` in the source-backed private internal prelude module and expose only its opaque type through the public prelude. The checker hides its representation from ordinary modules; derived gates and `pure` remain its builders. This settles `poke`; it does not decide the representation of `ask` or `qath`.
47+24. **Settled: how the internal prelude provides `poke`.** On 2026-10-31, @iko chose to define `poke` in the source-backed private internal prelude module and re-export it through the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values. This settles `poke`; it does not decide the representation of `ask` or `qath`.
48
48
49## Grammar questions never put to the doc's author
49## Grammar questions never put to the doc's author
50
50
docs/prelude-inventory.md+2
@@ -4,6 +4,8 @@ This is a working inventory, not a completed prelude interface. It lists top-lev
4
4
5The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read through Clay with `tools/ship scry /cx/=base=/sys/hoon/hoon --raw`. SHA-256: `ef538ced0877230f02ff86f9fb7a0abc6833bb1cf0e8675742b4d6ce478fcc92`. It differs in bytes from [upstream Hoon at the inspected commit](https://github.com/urbit/urbit/blob/5a187fededc4582a34fcd6055c67bb63e0917b94/pkg/arvo/sys/hoon.hoon); verify against the actual target ship when updating this inventory.
5The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read through Clay with `tools/ship scry /cx/=base=/sys/hoon/hoon --raw`. SHA-256: `ef538ced0877230f02ff86f9fb7a0abc6833bb1cf0e8675742b4d6ce478fcc92`. It differs in bytes from [upstream Hoon at the inspected commit](https://github.com/urbit/urbit/blob/5a187fededc4582a34fcd6055c67bb63e0917b94/pkg/arvo/sys/hoon.hoon); verify against the actual target ship when updating this inventory.
6
6
7+The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `ask` and `qath` are not yet defined there.
8+
7Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
9Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
8
10
9## 1a
11## 1a
docs/prompts/milestone-2.md+2−2
@@ -49,7 +49,7 @@ And from the plan's Risks:
49
49
50## First steps
50## First steps
51
51
52−1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `poke`; the public prelude exposes only its opaque type, and the checker hides its representation from ordinary modules, as question 24 records. Derived gates and `pure` remain its builders. This decision does not specify the representation of `ask` or `qath`.
52+1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `poke`; the public prelude re-exports it as an ordinary transparent type that modules can construct and inspect, as question 24 records. This decision does not specify the representation of `ask` or `qath`.
53
53
54 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
54 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
@@ -68,7 +68,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
68- A sample's mold may be left out: every bare name in a sample binds, at any depth, as in `|=(p title.p)` "when the call fixes the type", `|= [a=@ b]` and `|=(m ~)`.
68- A sample's mold may be left out: every bare name in a sample binds, at any depth, as in `|=(p title.p)` "when the call fixes the type", `|= [a=@ b]` and `|=(m ~)`.
69- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
69- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
70- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
70- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
71−- `poke`, `ask` and `qath` are opaque, built only by derived gates, `pure` and application-path literals.
71+- `poke` is transparent and re-exported from the source-backed internal prelude. `ask` and `qath` are opaque, built only by derived gates, `pure` and application-path literals.
72- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
72- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
73
73
74**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
74**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
docs/spec/decisions.md+3−3
@@ -31,8 +31,8 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
31| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
31| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
32| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
32| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
33| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
33| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
34−| Effects | The library unions `cmd` and `sub`; pokes and requests are opaque, from derived gates and `pure`; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-10-29 |
34+| Effects | The library unions `cmd` and `sub`; `poke` is a transparent type, and requests are opaque, from derived gates and `pure`; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-10-31 |
35−| Opaque poke representation | The source-backed private internal prelude module defines `poke`; the public prelude exposes only its opaque type, and the checker hides its representation from ordinary modules. Its builders remain derived gates and `pure` | Decided 2026-10-31 |
35+| Poke representation | The source-backed private internal prelude module defines `poke`, and the public prelude re-exports it as an ordinary transparent type. Ordinary modules can construct and inspect its values | Decided 2026-10-31 |
36| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island watching such a request has a type error; typed segments by aura | Decided 2026-10-30 |
36| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island watching such a request has a type error; typed segments by aura | Decided 2026-10-30 |
37| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
37| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
38| Derived gates | API files and stores give a constructor per poke type and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-10-30 |
38| Derived gates | API files and stores give a constructor per poke type and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-10-30 |
@@ -68,7 +68,7 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
68| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
68| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
69| Transactions | None; one poke per command | Decided |
69| Transactions | None; one poke per command | Decided |
70| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
70| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
71−| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; the store's `+$ poke` is a declaration, not a mold; poked and watched through derived gates; one per page | Decided 2026-10-30 |
71+| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; the store's `+$ poke` is a declaration, not a mold; derived gates provide poke constructors and state requests; one per page | Decided 2026-10-31 |
72| Subscriptions | By agent and path, shared per page; the first fact is full state, so no paths that need a scry path | Decided 2026-10-29 |
72| Subscriptions | By agent and path, shared per page; the first fact is full state, so no paths that need a scry path | Decided 2026-10-29 |
73| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
73| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
74| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
74| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
docs/spec/grammar.md+3−2
@@ -129,7 +129,8 @@ A mold is only a type: never called on a noun, and with no default. Types are in
129- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. `%/blog/(slug)` is an `qath`, checked against routes and static files.
129- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. `%/blog/(slug)` is an `qath`, checked against routes and static files.
130- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
130- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
131- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
131- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
132−- **Opaque**: `poke`, `ask` and `qath`, built only by derived gates, `pure` and application-path literals. `poke` is defined in the source-backed private internal prelude module; the public prelude exposes only its opaque type, and the checker hides its representation from ordinary modules. Pokes are built by derived gates and `pure`. `(facts full diff …)` appears only in an API file's `paths`.
132+- **Pokes**: `poke` is defined in the source-backed private internal prelude module and re-exported by the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values.
133+- **Opaque**: `ask` and `qath`, built only by derived gates, `pure` and application-path literals. `(facts full diff …)` appears only in an API file's `paths`.
133- **Identity**: recursive molds go by name and module.
134- **Identity**: recursive molds go by name and module.
134
135
135`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
136`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
@@ -339,4 +340,4 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
339 button "Add" %add
340 button "Add" %add
340```
341```
341
342
342−A store is written like an API file: `state`, `+$ poke` and `(store init update)`. Islands poke it with derived constructors and watch it with `(state.cart |=%got)`, whose first fact is the current state and each later fact the next. It runs in the browser, shared by the page's islands.
343+A store is written like an API file: `state`, `+$ poke` and `(store init update)`. Islands can poke it with derived constructors and watch it with `(state.cart |=%got)`, whose first fact is the current state and each later fact the next. It runs in the browser, shared by the page's islands.
docs/spec/overview.md+2−2
@@ -78,7 +78,7 @@ Unused molds are skipped, so unsupported constructs elsewhere in a `/sur` file a
78
78
79## Prelude
79## Prelude
80
80
81−Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`; an island's bundle carries only what it uses. The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out. Jetted prelude functions have working Jibb implementations; the compiler recognizes their shapes and uses the Hoon versions so jets can fire. They may take gates as arguments (Core language). Private helpers and low-level primitives live in a separate internal prelude module, imported without exposing them; foundational public gates are implemented in Jibb on top of those primitives. This source-backed internal module defines `poke`; the public prelude exposes only its opaque type, and the checker hides its representation from ordinary modules. The prelude also holds `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, and the layout elements and molds.
81+Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`; an island's bundle carries only what it uses. The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out. Jetted prelude functions have working Jibb implementations; the compiler recognizes their shapes and uses the Hoon versions so jets can fire. They may take gates as arguments (Core language). Private helpers and low-level primitives live in a separate internal prelude module, imported without exposing them; foundational public gates are implemented in Jibb on top of those primitives. This source-backed internal module defines `poke`; the public prelude re-exports it as an ordinary transparent type, so ordinary modules can construct and inspect its values. The prelude also holds `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, and the layout elements and molds.
82
82
83| Group | Hoon | Jibb |
83| Group | Hoon | Jibb |
84| --- | --- | --- |
84| --- | --- | --- |
@@ -150,7 +150,7 @@ Loads and renders run in Nock.
150 [%url reply=$-(path M)]
150 [%url reply=$-(path M)]
151```
151```
152
152
153−- `poke` and `ask` are opaque, built only by derived gates and `pure`. A constructor such as `(todo-action.todo [%add draft.m])` checks its value and supplies the agent and mark, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store constructors poke the store in the browser.
153+- `poke` is a transparent type; `ask` is opaque, built only by derived gates and `pure`. A derived poke constructor such as `(todo-action.todo [%add draft.m])` checks its value and supplies the agent and mark, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store constructors poke the store in the browser.
154- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
154- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
155- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
155- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
156- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
156- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
docs/status.md+9−6
@@ -19,7 +19,7 @@ On 2026-10-30, @iko decided that Jibb drops `$?`, so a `+$` takes a union's case
19
19
20## Milestone 2: in progress
20## Milestone 2: in progress
21
21
22−The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass selected Hoon atoms, term singletons, the null singleton, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, with a bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, and detects missing sources and cycles. It does not yet check API or kind semantics, and the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, including nested cell and list positions; other partial-pattern context and non-wing subjects remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. The cart-store example’s `init` and `update` now infer, while its kind, declarations and full module remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Uncontextualized list construction, unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; mutually recursive local groups and recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the newly agreed shared-type `clap`, parsed but still awaiting checker and backend validation, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
22+The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass selected Hoon atoms, term singletons, the null singleton, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, with a bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, and detects missing sources and cycles. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. Complete private module checking, other API shapes, API paths, root API and kind checking, stores, `ask`, `pure`, lowering and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, including nested cell and list positions; other partial-pattern context and non-wing subjects remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the newly agreed shared-type `clap`, parsed but still awaiting checker and backend validation, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
23
23
24The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall`, `need`, `lure`, `weld`, `snoc` and `turn`. The validated standard `list` mold is injected when the prelude’s own gates are inferred; `weld` and `turn` have ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through direct or transitive mold aliases. List-dependent prelude mold aliases remain unsupported because their templates are prepared before injection. Unsupported entries such as most list helpers remain reserved but unavailable; backend validation of the helpers remains outstanding. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. Preparation rejects empty, malformed, conflicting or import-bearing source; the prepared value is trusted and must come unchanged from `+prepare-prelude`. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
24The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall`, `need`, `lure`, `weld`, `snoc` and `turn`. The validated standard `list` mold is injected when the prelude’s own gates are inferred; `weld` and `turn` have ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through direct or transitive mold aliases. List-dependent prelude mold aliases remain unsupported because their templates are prepared before injection. Unsupported entries such as most list helpers remain reserved but unavailable; backend validation of the helpers remains outstanding. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. Preparation rejects empty, malformed, conflicting or import-bearing source; the prepared value is trusted and must come unchanged from `+prepare-prelude`. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
25
25
@@ -39,8 +39,8 @@ What the plan asks for, and where it is:
39
39
40Besides the plan's list:
40Besides the plan's list:
41
41
42−- 550 golden cases: 334 that parse and 216 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
42+- 554 golden cases: 338 that parse and 216 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
43−- The 550-case corpus passed under `urbit eval` in 66.6 s. The fake ship passed all 557 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 38.4 s for sync and 44.4 s for tests. The importer golden compares 169 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
43+- The 554-case corpus passed under `urbit eval` in 67.8 s. The fake ship passed all 562 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 38.3 s for sync and 43.1 s for tests. The importer golden compares 169 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
44- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
44- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
45- Two independent audits before 7c739b7, one of which compared the library with a reference parser written in Python from the doc over about 19,000 generated programs. Before ab797a9, a second Python parser, written from the decisions, agreed with the library on 8,000 generated programs and 900 hand-written probes.
45- Two independent audits before 7c739b7, one of which compared the library with a reference parser written in Python from the doc over about 19,000 generated programs. Before ab797a9, a second Python parser, written from the decisions, agreed with the library on 8,000 generated programs and 900 hand-written probes.
46- Speed: starting `urbit eval` and building the library takes about 8 s. After that, a 2,000-line module of 400 definitions parses in about a second. Loops over definitions, arms, lines and items grow no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (library section 3).
46- Speed: starting `urbit eval` and building the library takes about 8 s. After that, a 2,000-line module of 400 definitions parses in about a second. Loops over definitions, arms, lines and items grow no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (library section 3).
@@ -104,24 +104,27 @@ Besides the plan's list:
104| ae35005 | 2026-10-31 | Import source-verified tagged Hoon unions |
104| ae35005 | 2026-10-31 | Import source-verified tagged Hoon unions |
105| ef2ea71 | 2026-10-31 | Report nested missing tags and contextualize union branch results |
105| ef2ea71 | 2026-10-31 | Report nested missing tags and contextualize union branch results |
106| 67f900e | 2026-10-31 | Infer local mutual gates and uncontextualized lists |
106| 67f900e | 2026-10-31 | Infer local mutual gates and uncontextualized lists |
107−| This change | 2026-10-31 | Contextualize finite union patterns and record opaque poke decision |
107+| 7ff15f1 | 2026-10-31 | Contextualize finite union patterns and record the initial poke decision |
108+| This change | 2026-10-31 | Expose transparent poke and infer selected API constructors |
108
109
109## Checking it
110## Checking it
110
111
111On a machine set up as [development.md](development.md) says:
112On a machine set up as [development.md](development.md) says:
112
113
113```
114```
114−tools/golden # 550 cases under urbit eval
115+tools/golden # 554 cases under urbit eval
115tools/importer-test # the Hoon importer fixture projection
116tools/importer-test # the Hoon importer fixture projection
116tools/type-import-test # the importer/checker bridge fixture
117tools/type-import-test # the importer/checker bridge fixture
118+tools/type-tlon-test # the real Tlon reader/checker fixture
117tools/type-mark-test # the mark/checker bridge fixture
119tools/type-mark-test # the mark/checker bridge fixture
120+tools/type-poke-test # the source-backed poke/API fixture
118tools/type-module-scope-test # module and prelude scope fixture
121tools/type-module-scope-test # module and prelude scope fixture
119tools/hoon check-spans-test # prints <<>> when the span checker works
122tools/hoon check-spans-test # prints <<>> when the span checker works
120tools/testdata/selftest # the tools themselves
123tools/testdata/selftest # the tools themselves
121tools/doc-blocks docs/spec # the doc's examples are golden cases
124tools/doc-blocks docs/spec # the doc's examples are golden cases
122tools/ship start
125tools/ship start
123tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
126tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
124−tools/ship test # the same 550 cases as -test arms on the ship
127+tools/ship test # the same 554 cases as -test arms on the ship
125tools/testdata/ship-selftest
128tools/testdata/ship-selftest
126tools/ship check-commit # |commit stores .jibb files
129tools/ship check-commit # |commit stores .jibb files
127tools/clay-fixtures # example /sur files and marks build through Clay
130tools/clay-fixtures # example /sur files and marks build through Clay
jibb-dev/lib/jibb.hoon+183−24
@@ -4608,6 +4608,7 @@
4608 [%atom aura=@ta]
4608 [%atom aura=@ta]
4609 [%any-atom ~]
4609 [%any-atom ~]
4610 [%flag ~]
4610 [%flag ~]
4611+ [%noun ~]
4611 [%tag id=@ud literal=lit constructor=?]
4612 [%tag id=@ud literal=lit constructor=?]
4612 [%const literal=lit]
4613 [%const literal=lit]
4613 [%collection name=term args=(list itype)]
4614 [%collection name=term args=(list itype)]
@@ -4661,6 +4662,7 @@
4661 %atom |
4662 %atom |
4662 %any-atom |
4663 %any-atom |
4663 %flag |
4664 %flag |
4665+ %noun |
4664 %tag =(n id.t)
4666 %tag =(n id.t)
4665 %const |
4667 %const |
4666 %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
4668 %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
@@ -4757,6 +4759,7 @@
4757 %atom |
4759 %atom |
4758 %any-atom &
4760 %any-atom &
4759 %flag |
4761 %flag |
4762+ %noun |
4760 %tag |
4763 %tag |
4761 %const |
4764 %const |
4762 %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
4765 %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
@@ -4827,6 +4830,7 @@
4827 %atom &
4830 %atom &
4828 %any-atom &
4831 %any-atom &
4829 %flag &
4832 %flag &
4833+ %noun |
4830 %tag &
4834 %tag &
4831 %const &
4835 %const &
4832 %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
4836 %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
@@ -4916,6 +4920,7 @@
4916 %cell &
4920 %cell &
4917 %union &
4921 %union &
4918 %recursive &
4922 %recursive &
4923+ %noun &
4919 %collection &
4924 %collection &
4920 %face $(t body.t)
4925 %face $(t body.t)
4921 %fn |($(t sample.t) $(t product.t))
4926 %fn |($(t sample.t) $(t product.t))
@@ -5055,6 +5060,15 @@
5055 =. actual (itype-walk actual sub)
5060 =. actual (itype-walk actual sub)
5056 =. expected (itype-walk expected sub)
5061 =. expected (itype-walk expected sub)
5057 ?: =(actual expected) [%ok sub next]
5062 ?: =(actual expected) [%ok sub next]
5063+ :: Any value can be used where a noun is expected. An unresolved
5064+ :: bare tag is fixed as a constant; a constructor still needs a gate.
5065+ ?: ?=(%noun -.expected)
5066+ ?: ?=(%tag -.actual)
5067+ ?: constructor.actual [%unknown ~]
5068+ [%ok [[id.actual expected] sub] next]
5069+ [%ok sub next]
5070+ :: An arbitrary noun is not known to fit a narrower type.
5071+ ?: &(?=(%noun -.actual) !?=(%var -.expected)) [%unknown ~]
5058 ?: &(?=(%recursive -.actual) ?=(%recursive -.expected))
5072 ?: &(?=(%recursive -.actual) ?=(%recursive -.expected))
5059 ?:(&(=(module.actual module.expected) =(name.actual name.expected)) [%ok sub next] [%bad ~])
5073 ?:(&(=(module.actual module.expected) =(name.actual name.expected)) [%ok sub next] [%bad ~])
5060 ?: &(|(?=(%recursive -.actual) ?=(%recursive -.expected)) !|(?=(%var -.actual) ?=(%var -.expected))) [%unknown ~]
5074 ?: &(|(?=(%recursive -.actual) ?=(%recursive -.expected)) !|(?=(%var -.actual) ?=(%var -.expected))) [%unknown ~]
@@ -5242,7 +5256,8 @@
5242+$ ischeme [typ=itype vars=(list @ud)]
5256+$ ischeme [typ=itype vars=(list @ud)]
5243+$ ienv (list [name=term scheme=ischeme])
5257+$ ienv (list [name=term scheme=ischeme])
5244+$ imold-types (list [name=term template=ischeme])
5258+$ imold-types (list [name=term template=ischeme])
5259++$ iderived [name=term agent=term mark=term]
5245−+$ ifile [values=ienv molds=imold-types at=path]
5260++$ ifile [values=ienv molds=imold-types at=path derived=(list iderived)]
5246+$ ijimports (list [face=term interface=ifile])
5261+$ ijimports (list [face=term interface=ifile])
5247+$ icap [name=@t id=@ud at=span]
5262+$ icap [name=@t id=@ud at=span]
5248+$ icaps (list icap)
5263+$ icaps (list icap)
@@ -5288,6 +5303,8 @@
5288:: generalize an aura from its sample, which requires constraint analysis
5303:: generalize an aura from its sample, which requires constraint analysis
5289:: beyond this fragment; leave those cases unresolved.
5304:: beyond this fragment; leave those cases unresolved.
5290::
5305::
5306+:: This helper only controls decimal defaulting in visible types. A noun
5307+:: may contain gates and is not proof of a gate-free value.
5291++ itype-has-gate
5308++ itype-has-gate
5292 |= t=itype
5309 |= t=itype
5293 ^- ?
5310 ^- ?
@@ -5306,6 +5323,7 @@
5306 %atom |
5323 %atom |
5307 %any-atom |
5324 %any-atom |
5308 %flag |
5325 %flag |
5326+ %noun |
5309 ==
5327 ==
5310::
5328::
5311++ default-decimals
5329++ default-decimals
@@ -5330,6 +5348,7 @@
5330 %atom ~
5348 %atom ~
5331 %any-atom ~
5349 %any-atom ~
5332 %flag ~
5350 %flag ~
5351+ %noun ~
5333 %tag ~
5352 %tag ~
5334 %const ~
5353 %const ~
5335 %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
5354 %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
@@ -5368,6 +5387,7 @@
5368 %atom t
5387 %atom t
5369 %any-atom t
5388 %any-atom t
5370 %flag t
5389 %flag t
5390+ %noun t
5371 %tag t
5391 %tag t
5372 %const t
5392 %const t
5373 %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
5393 %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
@@ -5391,6 +5411,7 @@
5391 %atom |
5411 %atom |
5392 %any-atom |
5412 %any-atom |
5393 %flag |
5413 %flag |
5414+ %noun |
5394 %tag |
5415 %tag |
5395 %const |
5416 %const |
5396 %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
5417 %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
@@ -5741,25 +5762,41 @@
5741 ?:(=(`origin origin.typ.template) `name.i.molds $(molds t.molds))
5762 ?:(=(`origin origin.typ.template) `name.i.molds $(molds t.molds))
5742 $(molds t.molds)
5763 $(molds t.molds)
5743::
5764::
5765+:: A public non-generic alias names exactly its origin and arguments.
5766+:: Reusing only an origin could print a different generic instantiation.
5767+++ prelude-union-alias
5768+ |= [origin=[at=path name=term] args=(list itype) molds=imold-types]
5769+ ^- (unit term)
5770+ ?^ args ~
5771+ ?~ molds ~
5772+ =/ template=ischeme template.i.molds
5773+ ?: &(?=(~ vars.template) ?=(%union -.typ.template))
5774+ ?:(&(=(`origin origin.typ.template) =(args args.typ.template)) `name.i.molds $(molds t.molds))
5775+ $(molds t.molds)
5776+::
5744−:: Only names exported by this directly imported module are visible through
5777+:: Names exported by the directly imported module are visible through its
5745−:: its face. Other origins retain identity but print as unnamed unions.
5778+:: face; a matching prelude alias is also visible without a qualifier.
5746::
5779::
5747++ itype-in-import
5780++ itype-in-import
5748− |= [t=itype iface=ifile face=term]
5781+ |= [t=itype iface=ifile face=term prelude=(unit ifile)]
5749 ^- itype
5782 ^- itype
5750 ?- -.t
5783 ?- -.t
5751 %union
5784 %union
5752 =/ label=(unit @t)
5785 =/ label=(unit @t)
5753 ?~ origin.t ~
5786 ?~ origin.t ~
5754 ?: =(at.u.origin.t /lib/jibb/prelude/jibb) `name.u.origin.t
5787 ?: =(at.u.origin.t /lib/jibb/prelude/jibb) `name.u.origin.t
5788+ =/ public=(unit term)
5789+ ?~ prelude ~
5790+ (prelude-union-alias u.origin.t args.t molds.u.prelude)
5791+ ?^ public `u.public
5755 =/ alias=(unit term) ~
5792 =/ alias=(unit term) ~
5756 =? alias &(=(at.u.origin.t at.iface) ?=(^ (find-jibb-mold name.u.origin.t iface))) `name.u.origin.t
5793 =? alias &(=(at.u.origin.t at.iface) ?=(^ (find-jibb-mold name.u.origin.t iface))) `name.u.origin.t
5757 =? alias ?=(~ alias) (imported-union-alias u.origin.t molds.iface)
5794 =? alias ?=(~ alias) (imported-union-alias u.origin.t molds.iface)
5758 ?~ alias ~
5795 ?~ alias ~
5759 `(crip "{(trip u.alias)}.{(trip face)}")
5796 `(crip "{(trip u.alias)}.{(trip face)}")
5760− [%union (turn cases.t |=(c=itype (itype-in-import c iface face))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face)))]
5797+ [%union (turn cases.t |=(c=itype (itype-in-import c iface face prelude))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
5761 %recursive [%recursive module.t name.t ~]
5798 %recursive [%recursive module.t name.t ~]
5762− %collection [%collection name.t (turn args.t |=(c=itype (itype-in-import c iface face)))]
5799+ %collection [%collection name.t (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
5763 %face [%face name.t $(t body.t)]
5800 %face [%face name.t $(t body.t)]
5764 %fn [%fn $(t sample.t) $(t product.t)]
5801 %fn [%fn $(t sample.t) $(t product.t)]
5765 %cell [%cell $(t hed.t) $(t tal.t)]
5802 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -5959,6 +5996,7 @@
5959 ?: =(0 aura.sh) `[[%any-atom ~] state]
5996 ?: =(0 aura.sh) `[[%any-atom ~] state]
5960 `[[%atom aura.sh] state]
5997 `[[%atom aura.sh] state]
5961 %flag `[[%flag ~] state]
5998 %flag `[[%flag ~] state]
5999+ %noun `[[%noun ~] state]
5962 %const
6000 %const
5963 ?. |(=(%term form.lit.sh) =(%null form.lit.sh)) ~
6001 ?. |(=(%term form.lit.sh) =(%null form.lit.sh)) ~
5964 `[[%const lit.sh] state]
6002 `[[%const lit.sh] state]
@@ -5985,7 +6023,7 @@
5985 =/ found=(unit ischeme) (find-jibb-mold n u.iface)
6023 =/ found=(unit ischeme) (find-jibb-mold n u.iface)
5986 ?~ found ~
6024 ?~ found ~
5987 ?^ vars.u.found ~
6025 ?^ vars.u.found ~
5988− `[(itype-in-import typ.u.found u.iface i.t.names.sh) state]
6026+ `[(itype-in-import typ.u.found u.iface i.t.names.sh prelude.state) state]
5989 =/ found=(unit itype)
6027 =/ found=(unit itype)
5990 (find-imported-mold i.t.names.sh n externals.state surs.state)
6028 (find-imported-mold i.t.names.sh n externals.state surs.state)
5991 ?~ found ~
6029 ?~ found ~
@@ -6022,7 +6060,7 @@
6022 ?~ vars.u.template ~
6060 ?~ vars.u.template ~
6023 =/ applied=(unit itype) (template-apply u.template types.u.args)
6061 =/ applied=(unit itype) (template-apply u.template types.u.args)
6024 ?~ applied ~
6062 ?~ applied ~
6025− `[(itype-in-import u.applied u.iface i.t.ref.sh) state.u.args]
6063+ `[(itype-in-import u.applied u.iface i.t.ref.sh prelude.state.u.args) state.u.args]
6026 ?: (lien active.state.u.args |=(x=term =(x n))) ~
6064 ?: (lien active.state.u.args |=(x=term =(x n))) ~
6027 =/ found=(unit shape) (find-simple-mold n molds.state.u.args)
6065 =/ found=(unit shape) (find-simple-mold n molds.state.u.args)
6028 ?~ found
6066 ?~ found
@@ -7210,7 +7248,7 @@
7210 ?~ iface (infer-field-wing names.e env state)
7248 ?~ iface (infer-field-wing names.e env state)
7211 =/ member=(unit ischeme) (ienv-lookup i.names.e values.u.iface)
7249 =/ member=(unit ischeme) (ienv-lookup i.names.e values.u.iface)
7212 ?~ member [%| ["module member is not available to partial inference" ~]]
7250 ?~ member [%| ["module member is not available to partial inference" ~]]
7213− =. typ.u.member (itype-in-import typ.u.member u.iface i.t.names.e)
7251+ =. typ.u.member (itype-in-import typ.u.member u.iface i.t.names.e prelude.state)
7214 =/ instance=[typ=itype state=istate] (instantiate-scheme u.member state)
7252 =/ instance=[typ=itype state=istate] (instantiate-scheme u.member state)
7215 [%& typ.instance state.instance]
7253 [%& typ.instance state.instance]
7216 =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
7254 =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
@@ -7559,7 +7597,7 @@
7559 ?~ t.names |
7597 ?~ t.names |
7560 =. typ (itype-walk typ sub)
7598 =. typ (itype-walk typ sub)
7561 ?: ?=(%cell -.typ) $(typ tal.typ, names t.names)
7599 ?: ?=(%cell -.typ) $(typ tal.typ, names t.names)
7562− |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
7600+ |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%noun -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
7563::
7601::
7564++ infer-cell-branch
7602++ infer-cell-branch
7565 |= [e=expr env=ienv state=istate]
7603 |= [e=expr env=ienv state=istate]
@@ -7605,6 +7643,7 @@
7605 %atom "@{(trip aura.t)}"
7643 %atom "@{(trip aura.t)}"
7606 %any-atom "@"
7644 %any-atom "@"
7607 %flag "?"
7645 %flag "?"
7646+ %noun "*"
7608 %tag (trip txt.literal.t)
7647 %tag (trip txt.literal.t)
7609 %const (trip txt.literal.t)
7648 %const (trip txt.literal.t)
7610 %union
7649 %union
@@ -7652,6 +7691,7 @@
7652 %atom |
7691 %atom |
7653 %any-atom |
7692 %any-atom |
7654 %flag |
7693 %flag |
7694+ %noun |
7655 %tag |
7695 %tag |
7656 %const |
7696 %const |
7657 %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
7697 %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
@@ -7760,6 +7800,7 @@
7760 %atom |
7800 %atom |
7761 %any-atom |
7801 %any-atom |
7762 %flag |
7802 %flag |
7803+ %noun |
7763 %tag |
7804 %tag |
7764 %const |
7805 %const |
7765 %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
7806 %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
@@ -8517,6 +8558,22 @@
8517 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
8558 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
8518 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
8559 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
8519::
8560::
8561+:: In an API file or before main's kind is known, a lone `+$ poke`
8562+:: may be a declaration rather than a mold that shadows the prelude. Do not call
8563+:: that one collision definite, and do not hide unrelated scope errors.
8564+++ pending-declared-poke
8565+ |= [at=path mod=module prelude-values=(list term) prelude-molds=(list term)]
8566+ ^- ?
8567+ ?. (lien prelude-molds |=(n=term =(%poke n))) |
8568+ ?. |(?=([%ui %api @ %jibb ~] at) (lien defs.mod |=(d=def &(?=(%value -.d) =(%main name.d))))) |
8569+ =/ pokes=(list def)
8570+ (skim defs.mod |=(d=def &(?=(%mold -.d) =(%poke name.d))))
8571+ ?~ pokes |
8572+ ?^ t.pokes |
8573+ =/ remaining=(list def)
8574+ (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
8575+ (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
8576+::
8520++ module-mold-types
8577++ module-mold-types
8521 |= [molds=imolds state=istate]
8578 |= [molds=imolds state=istate]
8522 ^- (each imold-types @t)
8579 ^- (each imold-types @t)
@@ -8532,9 +8589,9 @@
8532::
8589::
8533:: Prepare a provisional interface from the trusted vendored source.
8590:: Prepare a provisional interface from the trusted vendored source.
8534:: Every declared name remains reserved, but only molds and values this
8591:: Every declared name remains reserved, but only molds and values this
8535−:: fragment can infer are usable. Unsupported bodies are not validated,
8592+:: fragment can infer are usable. Unsupported bodies are not validated.
8536−:: and imports into the prelude are not supported yet. The fixed origin
8593+:: An optional internal source supplies the prelude's one supported import;
8537−:: gives its named unions the same identity in every importing module.
8594+:: clients cannot import that path directly. Named unions retain their origin.
8538::
8595::
8539:: Recognize only the complete standard prelude list shape. Its recursive
8596:: Recognize only the complete standard prelude list shape. Its recursive
8540:: tail uses the same parameter and the unqualified list name. The reader
8597:: tail uses the same parameter and the unqualified list name. The reader
@@ -8574,6 +8631,13 @@
8574 ?. ?=(%tvar -.i.args.tail) |
8631 ?. ?=(%tvar -.i.args.tail) |
8575 =(var name.i.args.tail)
8632 =(var name.i.args.tail)
8576::
8633::
8634+++ prelude-label
8635+ |= [typ=itype name=term]
8636+ ^- itype
8637+ ?. ?=(%union -.typ) typ
8638+ ?^ args.typ typ
8639+ typ(label `name)
8640+::
8577++ partial-prelude-molds
8641++ partial-prelude-molds
8578 |= [molds=imolds state=istate]
8642 |= [molds=imolds state=istate]
8579 ^- imold-types
8643 ^- imold-types
@@ -8586,22 +8650,32 @@
8586 (infer-mold-template body.m state(active [name.m active.state], in-mold &))
8650 (infer-mold-template body.m state(active [name.m active.state], in-mold &))
8587 ?~ out $(molds t.molds)
8651 ?~ out $(molds t.molds)
8588 =. typ.template.u.out (label-direct-union typ.template.u.out body.m name.m state)
8652 =. typ.template.u.out (label-direct-union typ.template.u.out body.m name.m state)
8653+ =. typ.template.u.out (prelude-label typ.template.u.out name.m)
8589 [[name.m template.u.out] $(molds t.molds)]
8654 [[name.m template.u.out] $(molds t.molds)]
8590::
8655::
8591−++ partial-prelude-interface
8656+++ partial-prelude-interface-with-internal
8592− |= src=@t
8657+ |= [src=@t internal-source=(unit @t)]
8593 ^- (unit ifile)
8658 ^- (unit ifile)
8594 ?: =(0 src) ~
8659 ?: =(0 src) ~
8595 =/ at=path /lib/jibb/prelude/jibb
8660 =/ at=path /lib/jibb/prelude/jibb
8596 =/ parsed (parse at src)
8661 =/ parsed (parse at src)
8597 ?: ?=(%| -.parsed) ~
8662 ?: ?=(%| -.parsed) ~
8663+ =/ private=(unit ijimports)
8664+ ?~ imports.p.parsed `~
8665+ ?. ?=([[%jibb *] ~] imports.p.parsed) ~
8666+ ?. =(path.i.imports.p.parsed /lib/jibb/internal) ~
8667+ ?~ internal-source ~
8668+ =/ built=jfile-result
8669+ (infer-jibb-file /lib/jibb/internal/jibb u.internal-source ~ ~ ~ ~[/lib/jibb/internal/jibb] ~ ~ ~ ~)
8670+ ?: ?=(%| -.built) ~
8598− ?^ imports.p.parsed ~
8671+ `~[[face.i.imports.p.parsed iface.p.built]]
8672+ ?~ private ~
8599 ?~ defs.p.parsed ~
8673 ?~ defs.p.parsed ~
8600 ?. (module-scope-valid p.parsed ~ ~) ~
8674 ?. (module-scope-valid p.parsed ~ ~) ~
8601 =/ ds=(list def) defs.p.parsed
8675 =/ ds=(list def) defs.p.parsed
8602 =/ molds=imolds (collect-simple-molds ds)
8676 =/ molds=imolds (collect-simple-molds ds)
8603 =/ names=(list term) (turn molds |=(m=[name=term body=shape] name.m))
8677 =/ names=(list term) (turn molds |=(m=[name=term body=shape] name.m))
8604− =/ globals=(list term) (global-value-names ds)
8678+ =/ globals=(list term) (weld (import-binding-names imports.p.parsed) (global-value-names ds))
8605 :: Remove raw list before inferring any template, so an altered list
8679 :: Remove raw list before inferring any template, so an altered list
8606 :: cannot leak through an alias. Its name remains reserved either way.
8680 :: cannot leak through an alias. Its name remains reserved either way.
8607 =/ declared=? (lien names |=(name=term =(%list name)))
8681 =/ declared=? (lien names |=(name=term =(%list name)))
@@ -8609,11 +8683,26 @@
8609 =? env-molds declared
8683 =? env-molds declared
8610 (skim molds |=(m=[name=term body=shape] !=(%list name.m)))
8684 (skim molds |=(m=[name=term body=shape] !=(%list name.m)))
8611 =/ reserved=(list term) ?:(declared ~[%list] ~)
8685 =/ reserved=(list term) ?:(declared ~[%list] ~)
8612− =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ ~ reserved ~ ~ ~ | at names ~]
8686+ =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ u.private reserved ~ ~ ~ | at names ~]
8613 =/ mt=imold-types (partial-prelude-molds molds state)
8687 =/ mt=imold-types (partial-prelude-molds molds state)
8614− =/ partial=ifile [~ mt at]
8688+ =/ partial=ifile [~ mt at ~]
8689+ :: An explicitly qualified re-export must resolve. Other unsupported
8690+ :: prelude declarations remain reserved but absent from the interface.
8691+ =/ required=imolds
8692+ %+ skim molds
8693+ |= m=[name=term body=shape]
8694+ =/ sh=shape body.m
8695+ ?. ?=(%ref -.sh) |
8696+ ?~ names.sh |
8697+ ?=(^ t.names.sh)
8698+ ?. (levy required |=(m=[name=term body=shape] ?=(^ (find-jibb-mold name.m partial)))) ~
8615− =/ env=ienv (resolve-supported-defs ds env-molds globals ~ ~ ~ ~ ~ reserved at `partial)
8699+ =/ env=ienv (resolve-supported-defs ds env-molds globals ~ ~ ~ ~ u.private reserved at `partial)
8616− `[env mt at]
8700+ `[env mt at ~]
8701+::
8702+++ partial-prelude-interface
8703+ |= src=@t
8704+ ^- (unit ifile)
8705+ (partial-prelude-interface-with-internal src ~)
8617::
8706::
8618+$ iprelude [iface=ifile values=(list term) molds=(list term)]
8707+$ iprelude [iface=ifile values=(list term) molds=(list term)]
8619::
8708::
@@ -8628,6 +8717,17 @@
8628 =/ ms=(list term) (turn (collect-simple-molds defs.p.parsed) |=(m=[name=term body=shape] name.m))
8717 =/ ms=(list term) (turn (collect-simple-molds defs.p.parsed) |=(m=[name=term body=shape] name.m))
8629 `[u.iface vals ms]
8718 `[u.iface vals ms]
8630::
8719::
8720+++ prepare-prelude-with-internal
8721+ |= [src=@t internal-source=@t]
8722+ ^- (unit iprelude)
8723+ =/ iface=(unit ifile) (partial-prelude-interface-with-internal src `internal-source)
8724+ ?~ iface ~
8725+ =/ parsed (parse /lib/jibb/prelude/jibb src)
8726+ ?: ?=(%| -.parsed) ~
8727+ =/ vals=(list term) (global-value-names defs.p.parsed)
8728+ =/ ms=(list term) (turn (collect-simple-molds defs.p.parsed) |=(m=[name=term body=shape] name.m))
8729+ `[u.iface vals ms]
8730+::
8631++ module-values-complete
8731++ module-values-complete
8632 |= [ds=(list def) env=ienv]
8732 |= [ds=(list def) env=ienv]
8633 ^- ?
8733 ^- ?
@@ -8654,6 +8754,8 @@
8654 ?~ imports [%& [~ cache]]
8754 ?~ imports [%& [~ cache]]
8655 ?. ?=(%jibb -.i.imports) $(imports t.imports)
8755 ?. ?=(%jibb -.i.imports) $(imports t.imports)
8656 =/ at=path (weld path.i.imports `path`~[%jibb])
8756 =/ at=path (weld path.i.imports `path`~[%jibb])
8757+ ?: =(at /lib/jibb/internal/jibb)
8758+ [%| 'the prelude internal module is private']
8657 ?: (lien active |=(p=path =(p at)))
8759 ?: (lien active |=(p=path =(p at)))
8658 [%| (crip "import cycle at {(spud at)}")]
8760 [%| (crip "import cycle at {(spud at)}")]
8659 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
8761 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
@@ -8668,14 +8770,63 @@
8668 ?: ?=(%| -.rest) rest
8770 ?: ?=(%| -.rest) rest
8669 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
8771 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
8670::
8772::
8773+++ api-mark-exports
8774+ |= [marks=(list term) all=(list term) externals=imark-externals]
8775+ ^- imold-types
8776+ ?~ marks ~
8777+ =/ t=(unit itype) (find-imported-mark i.marks externals all)
8778+ ?~ t $(marks t.marks)
8779+ [[i.marks [u.t ~]] $(marks t.marks)]
8780+::
8781+:: Experimental direct poke-only API. Unsupported API declarations fail
8782+:: as a whole; supplied mark reader results retain their existing boundary.
8783+++ api-poke-interface
8784+ |= [at=path mod=module mark-externals=imark-externals prelude-values=(list term) prelude-molds=(list term) prelude=(unit ifile)]
8785+ ^- (unit ifile)
8786+ ?. ?=([%ui %api @ %jibb ~] at) ~
8787+ ?~ prelude ~
8788+ ?. =(at.u.prelude /lib/jibb/prelude/jibb) ~
8789+ =/ poke=(unit ischeme) (find-jibb-mold %poke u.prelude)
8790+ ?~ poke ~
8791+ ?. ?=(%union -.typ.u.poke) ~
8792+ ?^ vars.u.poke ~
8793+ =/ compatible=?
8794+ %+ lien cases.typ.u.poke
8795+ |= c=itype
8796+ ?=([%cell [%const [%term %tas %agent *]] [%cell [%face %agent [%atom %tas]] [%cell [%face %mark [%atom %tas]] [%face %payload [%noun ~]]]]] c)
8797+ ?. compatible ~
8798+ ?. (module-scope-valid mod(defs ~) prelude-values prelude-molds) ~
8799+ ?. (levy imports.mod |=(i=import ?=(%mark -.i))) ~
8800+ =/ marks=(list term) (collect-mark-imports imports.mod)
8801+ ?. ?=([@ ~] marks) ~
8802+ =/ ds=(list def) defs.mod
8803+ ?. ?=([[%mold *] ~] ds) ~
8804+ ?. =(%poke name.i.ds) ~
8805+ =/ sh=shape shape.i.ds
8806+ ?. ?=([%ref *] sh) ~
8807+ ?. ?=([@ ~] names.sh) ~
8808+ =/ n=term i.names.sh
8809+ ?. (unique-value-name n marks) ~
8810+ ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
8811+ =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
8812+ ?~ mark ~
8813+ =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
8814+ `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]]]
8815+::
8671++ infer-jibb-file
8816++ infer-jibb-file
8672 |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
8817 |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
8673 ^- jfile-result
8818 ^- jfile-result
8674− ?: ?=([%ui %api *] at) [%| (crip "API module needs unsupported inference: {(spud at)}")]
8675 =/ parsed (parse at src)
8819 =/ parsed (parse at src)
8676 ?: ?=(%| -.parsed) [%| (crip "module source does not parse: {(spud at)}")]
8820 ?: ?=(%| -.parsed) [%| (crip "module source does not parse: {(spud at)}")]
8677 =/ mod=module p.parsed
8821 =/ mod=module p.parsed
8822+ ?: ?=([%ui %api *] at)
8823+ =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
8824+ ?~ iface [%| (crip "API module needs unsupported inference: {(spud at)}")]
8825+ [%& [u.iface [[at u.iface] cache]]]
8678− ?. (module-scope-valid mod prelude-values prelude-molds) [%| (crip "module has conflicting names: {(spud at)}")]
8826+ ?. (module-scope-valid mod prelude-values prelude-molds)
8827+ ?: (pending-declared-poke at mod prelude-values prelude-molds)
8828+ [%| (crip "module kind or scope needs unsupported inference: {(spud at)}")]
8829+ [%| (crip "module has conflicting names: {(spud at)}")]
8679 =/ vals=(list term) (global-value-names defs.mod)
8830 =/ vals=(list term) (global-value-names defs.mod)
8680 ?: (lien vals |=(n=term =(n %main)))
8831 ?: (lien vals |=(n=term =(n %main)))
8681 [%| (crip "module kind needs unsupported inference: {(spud at)}")]
8832 [%| (crip "module kind needs unsupported inference: {(spud at)}")]
@@ -8693,7 +8844,7 @@
8693 =/ env=ienv (resolve-supported-defs defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
8844 =/ env=ienv (resolve-supported-defs defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
8694 ?. (module-values-complete defs.mod env)
8845 ?. (module-values-complete defs.mod env)
8695 [%| (crip "module definitions need unsupported inference: {(spud at)}")]
8846 [%| (crip "module definitions need unsupported inference: {(spud at)}")]
8696− [%& [[env p.mts at] [[at [env p.mts at]] cache.p.js]]]
8847+ [%& [[env p.mts at ~] [[at [env p.mts at ~]] cache.p.js]]]
8697::
8848::
8698:: +golden-types-with-modules fails closed for imports without prelude
8849:: +golden-types-with-modules fails closed for imports without prelude
8699:: scope. +golden-types-with-prelude resolves supported library graphs;
8850:: scope. +golden-types-with-prelude resolves supported library graphs;
@@ -8725,6 +8876,12 @@
8725 ?~ prepared 'partial inference; module not checked\0aprelude interface is not supported'
8876 ?~ prepared 'partial inference; module not checked\0aprelude interface is not supported'
8726 (golden-types-with-prepared-prelude file src externals mark-externals modules prepared)
8877 (golden-types-with-prepared-prelude file src externals mark-externals modules prepared)
8727::
8878::
8879+++ golden-types-with-prelude-and-internal
8880+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle prelude-source=@t internal-source=@t]
8881+ ^- @t
8882+ =/ prepared=(unit iprelude) (prepare-prelude-with-internal prelude-source internal-source)
8883+ (golden-types-with-prepared-prelude file src externals mark-externals modules prepared)
8884+::
8728++ golden-types-with-prepared-prelude
8885++ golden-types-with-prepared-prelude
8729 |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle prepared=(unit iprelude)]
8886 |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle prepared=(unit iprelude)]
8730 ^- @t
8887 ^- @t
@@ -8735,6 +8892,8 @@
8735 =/ prelude-molds=(list term) molds.u.prepared
8892 =/ prelude-molds=(list term) molds.u.prepared
8736 =/ iface=(unit ifile) `iface.u.prepared
8893 =/ iface=(unit ifile) `iface.u.prepared
8737 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
8894 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
8895+ ?: (pending-declared-poke file p.parsed prelude-values prelude-molds)
8896+ 'partial inference; module not checked\0amodule kind or scope needs unsupported inference'
8738 'partial inference; module not checked\0amodule has conflicting names'
8897 'partial inference; module not checked\0amodule has conflicting names'
8739 =/ js=jimports-result
8898 =/ js=jimports-result
8740 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
8899 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
jibb-dev/lib/jibb/internal.jibbnew file+6
@@ -0,0 +1,6 @@
1+:: Representation for agent and in-process store pokes.
2+:: The prelude re-exports this mold; effect lowering and the runtime must
3+:: agree on these cells when effect execution is implemented.
4++$ poke
5+ [%agent agent=@tas mark=@tas payload=*]
6+ [%store module=@t action=@tas payload=*]
jibb-dev/lib/jibb/prelude.jibb+3
@@ -1,3 +1,6 @@
1+/= internal /lib/jibb/internal
2++$ poke poke.internal
3+
1:: Initial prelude functions. The rest of the inventory is still to come.
4:: Initial prelude functions. The rest of the inventory is still to come.
2++ same |= x=A x
5++ same |= x=A x
3
6
tests/golden/doc-grammar-06-cart-store/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar tab, section "Example: a store and an island", code block 6 of the tab (block 5 is the EBNF)
1source: Grammar tab, section "Example: a store and an island", code block 6 of the tab (block 5 is the EBNF)
2tests: 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))`
2tests: 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))`
3expect: parses
3expect: parses
4−expect-types: a partial inference report
4+expect-types: a partial inference report; store kind and declaration scope remain unresolved
tests/golden/doc-grammar-06-cart-store/types.txt+1−6
@@ -1,7 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ state: not checked
2+module kind or scope needs unsupported inference
3−+$ cart-action: cases proven disjoint; mold not checked
4−+$ poke: not checked
5−++ main: name is not available to partial inference
6−++ init: [items=(list @t) open=?]
7−++ update: $-([a=cart-action s=[items=(list @t) open=?]] [items=(list @t) open=?])
tests/golden/prelude-unit-list-transforms/source.jibb+3
@@ -1,3 +1,6 @@
1+/= internal /lib/jibb/internal
2++$ poke poke.internal
3+
1:: Initial prelude functions. The rest of the inventory is still to come.
4:: Initial prelude functions. The rest of the inventory is still to come.
2++ same |= x=A x
5++ same |= x=A x
3
6
tests/golden/prelude-unit-list-transforms/tokens.txt+1798−1785
@@ -1,1793 +1,1806 @@
1+1:1 glyph /=
2+1:4 name internal
3+1:13 glyph /
4+1:14 tight knot lib
5+1:17 tight glyph /
6+1:18 tight knot jibb
7+1:22 tight glyph /
8+1:23 tight knot internal
9+2:1 NEWLINE
1−2:1 glyph ++
10+2:1 glyph +$
2−2:4 name same
11+2:4 name poke
12+2:9 wing poke.internal
13+5:1 NEWLINE
14+5:1 glyph ++
15+5:4 name same
3−2:9 glyph |=
16+5:9 glyph |=
4−2:12 name x
17+5:12 name x
5−2:13 tight glyph =
18+5:13 tight glyph =
6−2:14 tight tvar A
19+5:14 tight tvar A
7−2:16 name x
20+5:16 name x
8−4:1 NEWLINE
21+7:1 NEWLINE
9−4:1 glyph ++
22+7:1 glyph ++
10−4:4 name head
23+7:4 name head
11−4:9 glyph |=
24+7:9 glyph |=
12−4:12 name p
25+7:12 name p
13−4:13 tight glyph =
26+7:13 tight glyph =
14−4:14 tight glyph [
27+7:14 tight glyph [
15−4:15 tight tvar A
28+7:15 tight tvar A
16−4:17 tvar B
29+7:17 tvar B
17−4:18 tight glyph ]
30+7:18 tight glyph ]
18−5:3 INDENT
31+8:3 INDENT
19−5:3 glyph ?-
32+8:3 glyph ?-
20−5:6 name p
33+8:6 name p
21−6:5 INDENT
34+9:5 INDENT
22−6:5 glyph [
35+9:5 glyph [
23−6:6 tight name a
36+9:6 tight name a
24−6:8 name b
37+9:8 name b
25−6:9 tight glyph ]
38+9:9 tight glyph ]
26−6:11 name a
39+9:11 name a
27−8:1 DEDENT
40+11:1 DEDENT
28−8:1 DEDENT
41+11:1 DEDENT
29−8:1 NEWLINE
42+11:1 NEWLINE
30−8:1 glyph ++
43+11:1 glyph ++
31−8:4 name tail
44+11:4 name tail
32−8:9 glyph |=
45+11:9 glyph |=
33−8:12 name p
46+11:12 name p
34−8:13 tight glyph =
47+11:13 tight glyph =
35−8:14 tight glyph [
48+11:14 tight glyph [
36−8:15 tight tvar A
49+11:15 tight tvar A
37−8:17 tvar B
50+11:17 tvar B
38−8:18 tight glyph ]
51+11:18 tight glyph ]
39−9:3 INDENT
52+12:3 INDENT
40−9:3 glyph ?-
53+12:3 glyph ?-
41−9:6 name p
54+12:6 name p
42−10:5 INDENT
55+13:5 INDENT
43−10:5 glyph [
56+13:5 glyph [
44−10:6 tight name a
57+13:6 tight name a
45−10:8 name b
58+13:8 name b
46−10:9 tight glyph ]
59+13:9 tight glyph ]
47−10:11 name b
60+13:11 name b
48−12:1 DEDENT
61+15:1 DEDENT
49−12:1 DEDENT
62+15:1 DEDENT
50−12:1 NEWLINE
63+15:1 NEWLINE
51−12:1 glyph ++
64+15:1 glyph ++
52−12:4 name not
65+15:4 name not
53−12:8 glyph |=
66+15:8 glyph |=
54−12:11 name b
67+15:11 name b
55−12:12 tight glyph =
68+15:12 tight glyph =
56−12:13 tight glyph ?
69+15:13 tight glyph ?
57−13:3 INDENT
70+16:3 INDENT
58−13:3 glyph ?-
71+16:3 glyph ?-
59−13:6 name b
72+16:6 name b
60−14:5 INDENT
73+17:5 INDENT
61−14:5 lit %.y
74+17:5 lit %.y
62−14:9 lit %.n
75+17:9 lit %.n
63−15:5 NEWLINE
76+18:5 NEWLINE
64−15:5 lit %.n
77+18:5 lit %.n
65−15:9 lit %.y
78+18:9 lit %.y
66−17:1 DEDENT
79+20:1 DEDENT
67−17:1 DEDENT
80+20:1 DEDENT
68−17:1 NEWLINE
81+20:1 NEWLINE
69−17:1 glyph +$
82+20:1 glyph +$
70−17:4 name list
83+20:4 name list
71−17:9 glyph |$
84+20:9 glyph |$
72−17:12 glyph [
85+20:12 glyph [
73−17:13 tight tvar A
86+20:13 tight tvar A
74−17:14 tight glyph ]
87+20:14 tight glyph ]
75−18:3 INDENT
88+21:3 INDENT
76−18:3 lit ~
89+21:3 lit ~
77−19:3 NEWLINE
90+22:3 NEWLINE
78−19:3 glyph [
91+22:3 glyph [
79−19:4 tight name i
92+22:4 tight name i
80−19:5 tight glyph =
93+22:5 tight glyph =
81−19:6 tight tvar A
94+22:6 tight tvar A
82−19:8 name t
95+22:8 name t
83−19:9 tight glyph =
96+22:9 tight glyph =
84−19:10 tight glyph (
97+22:10 tight glyph (
85−19:11 tight name list
98+22:11 tight name list
86−19:16 tvar A
99+22:16 tvar A
87−19:17 tight glyph )
100+22:17 tight glyph )
88−19:18 tight glyph ]
101+22:18 tight glyph ]
89−21:1 DEDENT
102+24:1 DEDENT
90−21:1 NEWLINE
103+24:1 NEWLINE
91−21:1 glyph +$
104+24:1 glyph +$
92−21:4 name unit
105+24:4 name unit
93−21:9 glyph |$
106+24:9 glyph |$
94−21:12 glyph [
107+24:12 glyph [
95−21:13 tight tvar A
108+24:13 tight tvar A
96−21:14 tight glyph ]
109+24:14 tight glyph ]
97−22:3 INDENT
110+25:3 INDENT
98−22:3 lit ~
111+25:3 lit ~
99−23:3 NEWLINE
112+26:3 NEWLINE
100−23:3 glyph [
113+26:3 glyph [
101−23:4 tight lit ~
114+26:4 tight lit ~
102−23:6 name u
115+26:6 name u
103−23:7 tight glyph =
116+26:7 tight glyph =
104−23:8 tight tvar A
117+26:8 tight tvar A
105−23:9 tight glyph ]
118+26:9 tight glyph ]
106−25:1 DEDENT
119+28:1 DEDENT
107−25:1 NEWLINE
120+28:1 NEWLINE
108−25:1 glyph ++
121+28:1 glyph ++
109−25:4 name fall
122+28:4 name fall
110−25:9 glyph |=
123+28:9 glyph |=
111−25:12 name args
124+28:12 name args
112−25:16 tight glyph =
125+28:16 tight glyph =
113−25:17 tight glyph [
126+28:17 tight glyph [
114−25:18 tight glyph (
127+28:18 tight glyph (
115−25:19 tight name unit
128+28:19 tight name unit
116−25:24 tvar A
129+28:24 tvar A
117−25:25 tight glyph )
130+28:25 tight glyph )
118−25:27 tvar A
131+28:27 tvar A
119−25:28 tight glyph ]
132+28:28 tight glyph ]
120−26:3 INDENT
133+29:3 INDENT
121−26:3 glyph ?-
134+29:3 glyph ?-
122−26:6 name args
135+29:6 name args
123−27:5 INDENT
136+30:5 INDENT
124−27:5 glyph [
137+30:5 glyph [
125−27:6 tight name maybe
138+30:6 tight name maybe
126−27:12 name fallback
139+30:12 name fallback
127−27:20 tight glyph ]
140+30:20 tight glyph ]
128−28:7 INDENT
141+31:7 INDENT
129−28:7 glyph ?-
142+31:7 glyph ?-
130−28:10 name maybe
143+31:10 name maybe
131−29:9 INDENT
144+32:9 INDENT
132−29:9 lit ~
145+32:9 lit ~
133−29:11 name fallback
146+32:11 name fallback
134−30:9 NEWLINE
147+33:9 NEWLINE
135−30:9 glyph [
148+33:9 glyph [
136−30:10 tight lit ~
149+33:10 tight lit ~
137−30:12 name value
150+33:12 name value
138−30:17 tight glyph ]
151+33:17 tight glyph ]
139−30:19 name value
152+33:19 name value
140−32:1 DEDENT
153+35:1 DEDENT
141−32:1 DEDENT
154+35:1 DEDENT
142−32:1 DEDENT
155+35:1 DEDENT
143−32:1 DEDENT
156+35:1 DEDENT
144−32:1 NEWLINE
157+35:1 NEWLINE
145−32:1 glyph ++
158+35:1 glyph ++
146−32:4 name need
159+35:4 name need
147−32:9 glyph |=
160+35:9 glyph |=
148−32:12 name maybe
161+35:12 name maybe
149−32:17 tight glyph =
162+35:17 tight glyph =
150−32:18 tight glyph (
163+35:18 tight glyph (
151−32:19 tight name unit
164+35:19 tight name unit
152−32:24 tvar A
165+35:24 tvar A
153−32:25 tight glyph )
166+35:25 tight glyph )
154−33:3 INDENT
167+36:3 INDENT
155−33:3 glyph ?-
168+36:3 glyph ?-
156−33:6 name maybe
169+36:6 name maybe
157−34:5 INDENT
170+37:5 INDENT
158−34:5 lit ~
171+37:5 lit ~
159−34:7 glyph !!
172+37:7 glyph !!
160−35:5 NEWLINE
173+38:5 NEWLINE
161−35:5 glyph [
174+38:5 glyph [
162−35:6 tight lit ~
175+38:6 tight lit ~
163−35:8 name value
176+38:8 name value
164−35:13 tight glyph ]
177+38:13 tight glyph ]
165−35:15 name value
178+38:15 name value
166−37:1 DEDENT
179+40:1 DEDENT
167−37:1 DEDENT
180+40:1 DEDENT
168−37:1 NEWLINE
181+40:1 NEWLINE
169−37:1 glyph ++
182+40:1 glyph ++
170−37:4 name weld
183+40:4 name weld
171−37:9 glyph |=
184+40:9 glyph |=
172−37:12 name args
185+40:12 name args
173−37:16 tight glyph =
186+40:16 tight glyph =
174−37:17 tight glyph [
187+40:17 tight glyph [
175−37:18 tight glyph (
188+40:18 tight glyph (
176−37:19 tight name list
189+40:19 tight name list
177−37:24 tvar A
190+40:24 tvar A
178−37:25 tight glyph )
191+40:25 tight glyph )
179−37:27 glyph (
192+40:27 glyph (
180−37:28 tight name list
193+40:28 tight name list
181−37:33 tvar A
194+40:33 tvar A
182−37:34 tight glyph )
195+40:34 tight glyph )
183−37:35 tight glyph ]
196+40:35 tight glyph ]
184−38:3 INDENT
197+41:3 INDENT
185−38:3 glyph ?-
198+41:3 glyph ?-
186−38:6 name args
199+41:6 name args
187−39:5 INDENT
200+42:5 INDENT
188−39:5 glyph [
201+42:5 glyph [
189−39:6 tight name xs
202+42:6 tight name xs
190−39:9 name ys
203+42:9 name ys
191−39:11 tight glyph ]
204+42:11 tight glyph ]
192−40:7 INDENT
205+43:7 INDENT
193−40:7 glyph ^-
206+43:7 glyph ^-
194−40:10 glyph (
207+43:10 glyph (
195−40:11 tight name list
208+43:11 tight name list
196−40:16 tvar A
209+43:16 tvar A
197−40:17 tight glyph )
210+43:17 tight glyph )
198−41:9 INDENT
211+44:9 INDENT
199−41:9 glyph ?-
212+44:9 glyph ?-
200−41:12 name xs
213+44:12 name xs
201−42:11 INDENT
214+45:11 INDENT
202−42:11 lit ~
215+45:11 lit ~
203−42:13 name ys
216+45:13 name ys
204−43:11 NEWLINE
217+46:11 NEWLINE
205−43:11 glyph [
218+46:11 glyph [
206−43:12 tight name item
219+46:12 tight name item
207−43:17 name rest
220+46:17 name rest
208−43:21 tight glyph ]
221+46:21 tight glyph ]
209−43:23 glyph [
222+46:23 glyph [
210−43:24 tight name item
223+46:24 tight name item
211−43:29 glyph (
224+46:29 glyph (
212−43:30 tight name weld
225+46:30 tight name weld
213−43:35 name rest
226+46:35 name rest
214−43:40 name ys
227+46:40 name ys
215−43:42 tight glyph )
228+46:42 tight glyph )
216−43:43 tight glyph ]
229+46:43 tight glyph ]
217−45:1 DEDENT
230+48:1 DEDENT
218−45:1 DEDENT
231+48:1 DEDENT
219−45:1 DEDENT
232+48:1 DEDENT
220−45:1 DEDENT
233+48:1 DEDENT
221−45:1 DEDENT
234+48:1 DEDENT
222−45:1 NEWLINE
235+48:1 NEWLINE
223−45:1 glyph ++
236+48:1 glyph ++
224−45:4 name turn
237+48:4 name turn
225−45:9 glyph |=
238+48:9 glyph |=
226−45:12 name args
239+48:12 name args
227−45:16 tight glyph =
240+48:16 tight glyph =
228−45:17 tight glyph [
241+48:17 tight glyph [
229−45:18 tight glyph (
242+48:18 tight glyph (
230−45:19 tight name list
243+48:19 tight name list
231−45:24 tvar A
244+48:24 tvar A
232−45:25 tight glyph )
245+48:25 tight glyph )
233−45:27 glyph $-(
246+48:27 glyph $-(
234−45:30 tight tvar A
247+48:30 tight tvar A
235−45:32 tvar B
248+48:32 tvar B
236−45:33 tight glyph )
249+48:33 tight glyph )
237−45:34 tight glyph ]
250+48:34 tight glyph ]
238−46:3 INDENT
251+49:3 INDENT
239−46:3 glyph ?-
252+49:3 glyph ?-
240−46:6 name args
253+49:6 name args
241−47:5 INDENT
254+50:5 INDENT
242−47:5 glyph [
255+50:5 glyph [
243−47:6 tight name xs
256+50:6 tight name xs
244−47:9 name f
257+50:9 name f
245−47:10 tight glyph ]
258+50:10 tight glyph ]
246−48:7 INDENT
259+51:7 INDENT
247−48:7 glyph ^-
260+51:7 glyph ^-
248−48:10 glyph (
261+51:10 glyph (
249−48:11 tight name list
262+51:11 tight name list
250−48:16 tvar B
263+51:16 tvar B
251−48:17 tight glyph )
264+51:17 tight glyph )
252−49:9 INDENT
265+52:9 INDENT
253−49:9 glyph ?-
266+52:9 glyph ?-
254−49:12 name xs
267+52:12 name xs
255−50:11 INDENT
268+53:11 INDENT
256−50:11 lit ~
269+53:11 lit ~
257−50:13 lit ~
270+53:13 lit ~
258−51:11 NEWLINE
271+54:11 NEWLINE
259−51:11 glyph [
272+54:11 glyph [
260−51:12 tight name item
273+54:12 tight name item
261−51:17 name rest
274+54:17 name rest
262−51:21 tight glyph ]
275+54:21 tight glyph ]
263−51:23 glyph [
276+54:23 glyph [
264−51:24 tight glyph (
277+54:24 tight glyph (
265−51:25 tight name f
278+54:25 tight name f
266−51:27 name item
279+54:27 name item
267−51:31 tight glyph )
280+54:31 tight glyph )
268−51:33 glyph (
281+54:33 glyph (
269−51:34 tight name turn
282+54:34 tight name turn
270−51:39 name rest
283+54:39 name rest
271−51:44 name f
284+54:44 name f
272−51:45 tight glyph )
285+54:45 tight glyph )
273−51:46 tight glyph ]
286+54:46 tight glyph ]
274−53:1 DEDENT
287+56:1 DEDENT
275−53:1 DEDENT
288+56:1 DEDENT
276−53:1 DEDENT
289+56:1 DEDENT
277−53:1 DEDENT
290+56:1 DEDENT
278−53:1 DEDENT
291+56:1 DEDENT
279−53:1 NEWLINE
292+56:1 NEWLINE
280−53:1 glyph +$
293+56:1 glyph +$
281−53:4 name dime
294+56:4 name dime
282−53:9 glyph [
295+56:9 glyph [
283−53:10 tight name p
296+56:10 tight name p
284−53:11 tight glyph =
297+56:11 tight glyph =
285−53:12 tight aura @ta
298+56:12 tight aura @ta
286−53:16 name q
299+56:16 name q
287−53:17 tight glyph =
300+56:17 tight glyph =
288−53:18 tight aura @
301+56:18 tight aura @
289−53:19 tight glyph ]
302+56:19 tight glyph ]
290−55:1 NEWLINE
303+58:1 NEWLINE
291−55:1 glyph +$
304+58:1 glyph +$
292−55:4 name hair
305+58:4 name hair
293−55:9 glyph [
306+58:9 glyph [
294−55:10 tight name p
307+58:10 tight name p
295−55:11 tight glyph =
308+58:11 tight glyph =
296−55:12 tight aura @ud
309+58:12 tight aura @ud
297−55:16 name q
310+58:16 name q
298−55:17 tight glyph =
311+58:17 tight glyph =
299−55:18 tight aura @ud
312+58:18 tight aura @ud
300−55:21 tight glyph ]
313+58:21 tight glyph ]
301−57:1 NEWLINE
314+60:1 NEWLINE
302−57:1 glyph +$
315+60:1 glyph +$
303−57:4 name pint
316+60:4 name pint
304−57:9 glyph [
317+60:9 glyph [
305−57:10 tight name p
318+60:10 tight name p
306−57:11 tight glyph =
319+60:11 tight glyph =
307−57:12 tight glyph [
320+60:12 tight glyph [
308−57:13 tight name p
321+60:13 tight name p
309−57:14 tight glyph =
322+60:14 tight glyph =
310−57:15 tight aura @
323+60:15 tight aura @
311−57:17 name q
324+60:17 name q
312−57:18 tight glyph =
325+60:18 tight glyph =
313−57:19 tight aura @
326+60:19 tight aura @
314−57:20 tight glyph ]
327+60:20 tight glyph ]
315−57:22 name q
328+60:22 name q
316−57:23 tight glyph =
329+60:23 tight glyph =
317−57:24 tight glyph [
330+60:24 tight glyph [
318−57:25 tight name p
331+60:25 tight name p
319−57:26 tight glyph =
332+60:26 tight glyph =
320−57:27 tight aura @
333+60:27 tight aura @
321−57:29 name q
334+60:29 name q
322−57:30 tight glyph =
335+60:30 tight glyph =
323−57:31 tight aura @
336+60:31 tight aura @
324−57:32 tight glyph ]
337+60:32 tight glyph ]
325−57:33 tight glyph ]
338+60:33 tight glyph ]
326−59:1 NEWLINE
339+62:1 NEWLINE
327−59:1 glyph +$
340+62:1 glyph +$
328−59:4 name coin
341+62:4 name coin
329−60:3 INDENT
342+63:3 INDENT
330−60:3 glyph [
343+63:3 glyph [
331−60:4 tight lit %$
344+63:4 tight lit %$
332−60:7 name p
345+63:7 name p
333−60:8 tight glyph =
346+63:8 tight glyph =
334−60:9 tight name dime
347+63:9 tight name dime
335−60:13 tight glyph ]
348+63:13 tight glyph ]
336−61:3 NEWLINE
349+64:3 NEWLINE
337−61:3 glyph [
350+64:3 glyph [
338−61:4 tight lit %blob
351+64:4 tight lit %blob
339−61:10 name p
352+64:10 name p
340−61:11 tight glyph =
353+64:11 tight glyph =
341−61:12 tight glyph *
354+64:12 tight glyph *
342−61:13 tight glyph ]
355+64:13 tight glyph ]
343−62:3 NEWLINE
356+65:3 NEWLINE
344−62:3 glyph [
357+65:3 glyph [
345−62:4 tight lit %many
358+65:4 tight lit %many
346−62:10 name p
359+65:10 name p
347−62:11 tight glyph =
360+65:11 tight glyph =
348−62:12 tight glyph (
361+65:12 tight glyph (
349−62:13 tight name list
362+65:13 tight name list
350−62:18 name coin
363+65:18 name coin
351−62:22 tight glyph )
364+65:22 tight glyph )
352−62:23 tight glyph ]
365+65:23 tight glyph ]
353−64:1 DEDENT
366+67:1 DEDENT
354−64:1 NEWLINE
367+67:1 NEWLINE
355−64:1 glyph +$
368+67:1 glyph +$
356−64:4 name pair
369+67:4 name pair
357−64:9 glyph |$
370+67:9 glyph |$
358−64:12 glyph [
371+67:12 glyph [
359−64:13 tight tvar A
372+67:13 tight tvar A
360−64:15 tvar B
373+67:15 tvar B
361−64:16 tight glyph ]
374+67:16 tight glyph ]
362−64:18 glyph [
375+67:18 glyph [
363−64:19 tight name p
376+67:19 tight name p
364−64:20 tight glyph =
377+67:20 tight glyph =
365−64:21 tight tvar A
378+67:21 tight tvar A
366−64:23 name q
379+67:23 name q
367−64:24 tight glyph =
380+67:24 tight glyph =
368−64:25 tight tvar B
381+67:25 tight tvar B
369−64:26 tight glyph ]
382+67:26 tight glyph ]
370−66:1 NEWLINE
383+69:1 NEWLINE
371−66:1 glyph +$
384+69:1 glyph +$
372−66:4 name trel
385+69:4 name trel
373−66:9 glyph |$
386+69:9 glyph |$
374−66:12 glyph [
387+69:12 glyph [
375−66:13 tight tvar A
388+69:13 tight tvar A
376−66:15 tvar B
389+69:15 tvar B
377−66:17 tvar C
390+69:17 tvar C
378−66:18 tight glyph ]
391+69:18 tight glyph ]
379−66:20 glyph [
392+69:20 glyph [
380−66:21 tight name p
393+69:21 tight name p
381−66:22 tight glyph =
394+69:22 tight glyph =
382−66:23 tight tvar A
395+69:23 tight tvar A
383−66:25 name q
396+69:25 name q
384−66:26 tight glyph =
397+69:26 tight glyph =
385−66:27 tight tvar B
398+69:27 tight tvar B
386−66:29 name r
399+69:29 name r
387−66:30 tight glyph =
400+69:30 tight glyph =
388−66:31 tight tvar C
401+69:31 tight tvar C
389−66:32 tight glyph ]
402+69:32 tight glyph ]
390−68:1 NEWLINE
403+71:1 NEWLINE
391−68:1 glyph +$
404+71:1 glyph +$
392−68:4 name qual
405+71:4 name qual
393−68:9 glyph |$
406+71:9 glyph |$
394−68:12 glyph [
407+71:12 glyph [
395−68:13 tight tvar A
408+71:13 tight tvar A
396−68:15 tvar B
409+71:15 tvar B
397−68:17 tvar C
410+71:17 tvar C
398−68:19 tvar D
411+71:19 tvar D
399−68:20 tight glyph ]
412+71:20 tight glyph ]
400−68:22 glyph [
413+71:22 glyph [
401−68:23 tight name p
414+71:23 tight name p
402−68:24 tight glyph =
415+71:24 tight glyph =
403−68:25 tight tvar A
416+71:25 tight tvar A
404−68:27 name q
417+71:27 name q
405−68:28 tight glyph =
418+71:28 tight glyph =
406−68:29 tight tvar B
419+71:29 tight tvar B
407−68:31 name r
420+71:31 name r
408−68:32 tight glyph =
421+71:32 tight glyph =
409−68:33 tight tvar C
422+71:33 tight tvar C
410−68:35 name s
423+71:35 name s
411−68:36 tight glyph =
424+71:36 tight glyph =
412−68:37 tight tvar D
425+71:37 tight tvar D
413−68:38 tight glyph ]
426+71:38 tight glyph ]
414−70:1 NEWLINE
427+73:1 NEWLINE
415−70:1 glyph +$
428+73:1 glyph +$
416−70:4 name cord
429+73:4 name cord
417−70:9 aura @t
430+73:9 aura @t
418−72:1 NEWLINE
431+75:1 NEWLINE
419−72:1 glyph +$
432+75:1 glyph +$
420−72:4 name knot
433+75:4 name knot
421−72:9 aura @ta
434+75:9 aura @ta
422−74:1 NEWLINE
435+77:1 NEWLINE
423−74:1 glyph +$
436+77:1 glyph +$
424−74:4 name tape
437+77:4 name tape
425−74:9 glyph (
438+77:9 glyph (
426−74:10 tight name list
439+77:10 tight name list
427−74:15 aura @tD
440+77:15 aura @tD
428−74:18 tight glyph )
441+77:18 tight glyph )
429−76:1 NEWLINE
442+79:1 NEWLINE
430−76:1 glyph +$
443+79:1 glyph +$
431−76:4 name path
444+79:4 name path
432−76:9 glyph (
445+79:9 glyph (
433−76:10 tight name list
446+79:10 tight name list
434−76:15 name knot
447+79:15 name knot
435−76:19 tight glyph )
448+79:19 tight glyph )
436−78:1 NEWLINE
449+81:1 NEWLINE
437−78:1 glyph +$
450+81:1 glyph +$
438−78:4 name tank
451+81:4 name tank
439−79:3 INDENT
452+82:3 INDENT
440−79:3 name cord
453+82:3 name cord
441−80:3 NEWLINE
454+83:3 NEWLINE
442−80:3 glyph [
455+83:3 glyph [
443−80:4 tight lit %leaf
456+83:4 tight lit %leaf
444−80:10 name p
457+83:10 name p
445−80:11 tight glyph =
458+83:11 tight glyph =
446−80:12 tight name tape
459+83:12 tight name tape
447−80:16 tight glyph ]
460+83:16 tight glyph ]
448−81:3 NEWLINE
461+84:3 NEWLINE
449−81:3 glyph [
462+84:3 glyph [
450−81:4 tight lit %palm
463+84:4 tight lit %palm
451−81:10 name p
452−81:11 tight glyph =
453−81:12 tight glyph (
454−81:13 tight name qual
455−81:18 name tape
456−81:23 name tape
457−81:28 name tape
458−81:33 name tape
459−81:37 tight glyph )
460−81:39 name q
461−81:40 tight glyph =
462−81:41 tight glyph (
463−81:42 tight name list
464−81:47 name tank
465−81:51 tight glyph )
466−81:52 tight glyph ]
467−82:3 NEWLINE
468−82:3 glyph [
469−82:4 tight lit %rose
470−82:10 name p
471−82:11 tight glyph =
472−82:12 tight glyph (
473−82:13 tight name trel
474−82:18 name tape
475−82:23 name tape
476−82:28 name tape
477−82:32 tight glyph )
478−82:34 name q
479−82:35 tight glyph =
480−82:36 tight glyph (
481−82:37 tight name list
482−82:42 name tank
483−82:46 tight glyph )
484−82:47 tight glyph ]
485−84:1 DEDENT
486−84:1 NEWLINE
487−84:1 glyph +$
488−84:4 name nail
489−84:9 glyph [
490−84:10 tight name p
464+84:10 name p
49184:11 tight glyph =
46584:11 tight glyph =
492−84:12 tight name hair
466+84:12 tight glyph (
467+84:13 tight name qual
468+84:18 name tape
469+84:23 name tape
470+84:28 name tape
471+84:33 name tape
472+84:37 tight glyph )
473+84:39 name q
474+84:40 tight glyph =
475+84:41 tight glyph (
476+84:42 tight name list
477+84:47 name tank
478+84:51 tight glyph )
479+84:52 tight glyph ]
480+85:3 NEWLINE
481+85:3 glyph [
482+85:4 tight lit %rose
483+85:10 name p
484+85:11 tight glyph =
485+85:12 tight glyph (
486+85:13 tight name trel
487+85:18 name tape
488+85:23 name tape
489+85:28 name tape
490+85:32 tight glyph )
491+85:34 name q
492+85:35 tight glyph =
493+85:36 tight glyph (
494+85:37 tight name list
495+85:42 name tank
496+85:46 tight glyph )
497+85:47 tight glyph ]
498+87:1 DEDENT
499+87:1 NEWLINE
500+87:1 glyph +$
501+87:4 name nail
502+87:9 glyph [
503+87:10 tight name p
504+87:11 tight glyph =
505+87:12 tight name hair
493−84:17 name q
506+87:17 name q
494−84:18 tight glyph =
507+87:18 tight glyph =
495−84:19 tight name tape
508+87:19 tight name tape
496−84:23 tight glyph ]
509+87:23 tight glyph ]
497−86:1 NEWLINE
510+89:1 NEWLINE
498−86:1 glyph +$
511+89:1 glyph +$
499−86:4 name edge
512+89:4 name edge
500−86:9 glyph [
513+89:9 glyph [
501−86:10 tight name p
514+89:10 tight name p
502−86:11 tight glyph =
515+89:11 tight glyph =
503−86:12 tight name hair
516+89:12 tight name hair
504−86:17 name q
517+89:17 name q
505−86:18 tight glyph =
518+89:18 tight glyph =
506−86:19 tight glyph (
519+89:19 tight glyph (
507−86:20 tight name unit
520+89:20 tight name unit
508−86:25 glyph [
521+89:25 glyph [
509−86:26 tight name p
522+89:26 tight name p
510−86:27 tight glyph =
523+89:27 tight glyph =
511−86:28 tight glyph *
524+89:28 tight glyph *
512−86:30 name q
525+89:30 name q
513−86:31 tight glyph =
526+89:31 tight glyph =
514−86:32 tight name nail
527+89:32 tight name nail
515−86:36 tight glyph ]
528+89:36 tight glyph ]
516−86:37 tight glyph )
529+89:37 tight glyph )
517−86:38 tight glyph ]
530+89:38 tight glyph ]
518−88:1 NEWLINE
531+91:1 NEWLINE
519−88:1 glyph +$
532+91:1 glyph +$
520−88:4 name rule
533+91:4 name rule
521−88:9 glyph $-(
534+91:9 glyph $-(
522−88:12 tight name nail
535+91:12 tight name nail
523−88:17 name edge
536+91:17 name edge
524−88:21 tight glyph )
537+91:21 tight glyph )
525−90:1 NEWLINE
538+93:1 NEWLINE
526−90:1 glyph +$
539+93:1 glyph +$
527−90:4 name spot
540+93:4 name spot
528−90:9 glyph [
541+93:9 glyph [
529−90:10 tight name p
542+93:10 tight name p
530−90:11 tight glyph =
543+93:11 tight glyph =
531−90:12 tight name path
544+93:12 tight name path
532−90:17 name q
545+93:17 name q
533−90:18 tight glyph =
546+93:18 tight glyph =
534−90:19 tight name pint
547+93:19 tight name pint
535−90:23 tight glyph ]
548+93:23 tight glyph ]
536−92:1 NEWLINE
549+95:1 NEWLINE
537−92:1 glyph +$
550+95:1 glyph +$
538−92:4 name toon
551+95:4 name toon
539−93:3 INDENT
552+96:3 INDENT
540−93:3 glyph [
553+96:3 glyph [
541−93:4 tight lit %0
554+96:4 tight lit %0
542−93:7 name p
555+96:7 name p
543−93:8 tight glyph =
556+96:8 tight glyph =
544−93:9 tight glyph *
557+96:9 tight glyph *
545−93:10 tight glyph ]
558+96:10 tight glyph ]
546−94:3 NEWLINE
559+97:3 NEWLINE
547−94:3 glyph [
560+97:3 glyph [
548−94:4 tight lit %1
561+97:4 tight lit %1
549−94:7 name p
562+97:7 name p
550−94:8 tight glyph =
563+97:8 tight glyph =
551−94:9 tight glyph *
564+97:9 tight glyph *
552−94:10 tight glyph ]
565+97:10 tight glyph ]
553−95:3 NEWLINE
566+98:3 NEWLINE
554−95:3 glyph [
567+98:3 glyph [
555−95:4 tight lit %2
568+98:4 tight lit %2
556−95:7 name p
569+98:7 name p
557−95:8 tight glyph =
570+98:8 tight glyph =
558−95:9 tight glyph (
571+98:9 tight glyph (
559−95:10 tight name list
572+98:10 tight name list
560−95:15 name tank
573+98:15 name tank
561−95:19 tight glyph )
574+98:19 tight glyph )
562−95:20 tight glyph ]
575+98:20 tight glyph ]
563−97:1 DEDENT
576+100:1 DEDENT
564−97:1 NEWLINE
577+100:1 NEWLINE
565−97:1 glyph +$
578+100:1 glyph +$
566−97:4 name like
579+100:4 name like
567−97:9 glyph |$
580+100:9 glyph |$
568−97:12 glyph [
581+100:12 glyph [
569−97:13 tight tvar A
582+100:13 tight tvar A
570−97:14 tight glyph ]
583+100:14 tight glyph ]
571−97:16 glyph [
584+100:16 glyph [
572−97:17 tight name p
585+100:17 tight name p
573−97:18 tight glyph =
586+100:18 tight glyph =
574−97:19 tight name hair
587+100:19 tight name hair
575−97:24 name q
588+100:24 name q
576−97:25 tight glyph =
589+100:25 tight glyph =
577−97:26 tight glyph (
590+100:26 tight glyph (
578−97:27 tight name unit
591+100:27 tight name unit
579−97:32 glyph [
592+100:32 glyph [
580−97:33 tight name p
593+100:33 tight name p
581−97:34 tight glyph =
594+100:34 tight glyph =
582−97:35 tight tvar A
595+100:35 tight tvar A
583−97:37 name q
596+100:37 name q
584−97:38 tight glyph =
597+100:38 tight glyph =
585−97:39 tight name nail
598+100:39 tight name nail
586−97:43 tight glyph ]
599+100:43 tight glyph ]
587−97:44 tight glyph )
600+100:44 tight glyph )
588−97:45 tight glyph ]
601+100:45 tight glyph ]
589−99:1 NEWLINE
602+102:1 NEWLINE
590−99:1 glyph ++
603+102:1 glyph ++
591−99:4 name wonk
604+102:4 name wonk
592−99:9 glyph |=
605+102:9 glyph |=
593−99:12 name veq
606+102:12 name veq
594−99:15 tight glyph =
607+102:15 tight glyph =
595−99:16 tight glyph (
608+102:16 tight glyph (
596−99:17 tight name like
609+102:17 tight name like
597−99:22 tvar A
610+102:22 tvar A
598−99:23 tight glyph )
611+102:23 tight glyph )
599−100:3 INDENT
612+103:3 INDENT
600−100:3 glyph ?-
613+103:3 glyph ?-
601−100:6 wing q.veq
614+103:6 wing q.veq
602−101:5 INDENT
615+104:5 INDENT
603−101:5 lit ~
616+104:5 lit ~
604−101:7 glyph !!
617+104:7 glyph !!
605−102:5 NEWLINE
618+105:5 NEWLINE
606−102:5 glyph [
619+105:5 glyph [
607−102:6 tight lit ~
620+105:6 tight lit ~
608−102:8 name product
621+105:8 name product
609−102:15 tight glyph ]
622+105:15 tight glyph ]
610−102:17 wing p.product
623+105:17 wing p.product
611−104:1 DEDENT
624+107:1 DEDENT
612−104:1 DEDENT
625+107:1 DEDENT
613−104:1 NEWLINE
626+107:1 NEWLINE
614−104:1 glyph +$
627+107:1 glyph +$
615−104:4 name lone
628+107:4 name lone
616−104:9 glyph |$
629+107:9 glyph |$
617−104:12 glyph [
630+107:12 glyph [
618−104:13 tight tvar A
631+107:13 tight tvar A
619−104:14 tight glyph ]
632+107:14 tight glyph ]
620−104:16 glyph [
633+107:16 glyph [
621−104:17 tight name p
634+107:17 tight name p
622−104:18 tight glyph =
635+107:18 tight glyph =
623−104:19 tight tvar A
636+107:19 tight tvar A
624−104:20 tight glyph ]
637+107:20 tight glyph ]
625−106:1 NEWLINE
638+109:1 NEWLINE
626−106:1 glyph +$
639+109:1 glyph +$
627−106:4 name lest
640+109:4 name lest
628−106:9 glyph |$
641+109:9 glyph |$
629−106:12 glyph [
642+109:12 glyph [
630−106:13 tight tvar A
643+109:13 tight tvar A
631−106:14 tight glyph ]
644+109:14 tight glyph ]
632−106:16 glyph [
645+109:16 glyph [
633−106:17 tight name i
646+109:17 tight name i
634−106:18 tight glyph =
647+109:18 tight glyph =
635−106:19 tight tvar A
648+109:19 tight tvar A
636−106:21 name t
649+109:21 name t
637−106:22 tight glyph =
650+109:22 tight glyph =
638−106:23 tight glyph (
651+109:23 tight glyph (
639−106:24 tight name list
652+109:24 tight name list
640−106:29 tvar A
653+109:29 tvar A
641−106:30 tight glyph )
654+109:30 tight glyph )
642−106:31 tight glyph ]
655+109:31 tight glyph ]
643−108:1 NEWLINE
656+111:1 NEWLINE
644−108:1 glyph +$
657+111:1 glyph +$
645−108:4 name pole
658+111:4 name pole
646−108:9 glyph |$
659+111:9 glyph |$
647−108:12 glyph [
660+111:12 glyph [
648−108:13 tight tvar A
661+111:13 tight tvar A
649−108:14 tight glyph ]
662+111:14 tight glyph ]
650−109:3 INDENT
663+112:3 INDENT
651−109:3 lit ~
664+112:3 lit ~
652−110:3 NEWLINE
665+113:3 NEWLINE
653−110:3 glyph [
666+113:3 glyph [
654−110:4 tight tvar A
667+113:4 tight tvar A
655−110:6 glyph (
668+113:6 glyph (
656−110:7 tight name pole
669+113:7 tight name pole
657−110:12 tvar A
670+113:12 tvar A
658−110:13 tight glyph )
671+113:13 tight glyph )
659−110:14 tight glyph ]
672+113:14 tight glyph ]
660−112:1 DEDENT
673+115:1 DEDENT
661−112:1 NEWLINE
674+115:1 NEWLINE
662−112:1 glyph +$
675+115:1 glyph +$
663−112:4 name quip
676+115:4 name quip
664−112:9 glyph |$
677+115:9 glyph |$
665−112:12 glyph [
678+115:12 glyph [
666−112:13 tight tvar A
679+115:13 tight tvar A
667−112:15 tvar B
680+115:15 tvar B
668−112:16 tight glyph ]
681+115:16 tight glyph ]
669−112:18 glyph [
682+115:18 glyph [
670−112:19 tight glyph (
683+115:19 tight glyph (
671−112:20 tight name list
684+115:20 tight name list
672−112:25 tvar A
685+115:25 tvar A
673−112:26 tight glyph )
686+115:26 tight glyph )
674−112:28 tvar B
687+115:28 tvar B
675−112:29 tight glyph ]
688+115:29 tight glyph ]
676−114:1 NEWLINE
689+117:1 NEWLINE
677−114:1 glyph +$
690+117:1 glyph +$
678−114:4 name tree
691+117:4 name tree
679−114:9 glyph |$
692+117:9 glyph |$
680−114:12 glyph [
693+117:12 glyph [
681−114:13 tight tvar A
694+117:13 tight tvar A
682−114:14 tight glyph ]
695+117:14 tight glyph ]
683−115:3 INDENT
696+118:3 INDENT
684−115:3 lit ~
697+118:3 lit ~
685−116:3 NEWLINE
698+119:3 NEWLINE
686−116:3 glyph [
687−116:4 tight name n
688−116:5 tight glyph =
689−116:6 tight tvar A
690−116:8 name l
691−116:9 tight glyph =
692−116:10 tight glyph (
693−116:11 tight name tree
694−116:16 tvar A
695−116:17 tight glyph )
696−116:19 name r
697−116:20 tight glyph =
698−116:21 tight glyph (
699−116:22 tight name tree
700−116:27 tvar A
701−116:28 tight glyph )
702−116:29 tight glyph ]
703−118:1 DEDENT
704−118:1 NEWLINE
705−118:1 glyph +$
706−118:4 name each
707−118:9 glyph |$
708−118:12 glyph [
709−118:13 tight tvar A
710−118:15 tvar B
711−118:16 tight glyph ]
712−119:3 INDENT
713119:3 glyph [
699119:3 glyph [
714−119:4 tight lit %|
700+119:4 tight name n
701+119:5 tight glyph =
702+119:6 tight tvar A
703+119:8 name l
704+119:9 tight glyph =
705+119:10 tight glyph (
706+119:11 tight name tree
707+119:16 tvar A
708+119:17 tight glyph )
709+119:19 name r
710+119:20 tight glyph =
711+119:21 tight glyph (
712+119:22 tight name tree
713+119:27 tvar A
714+119:28 tight glyph )
715+119:29 tight glyph ]
716+121:1 DEDENT
717+121:1 NEWLINE
718+121:1 glyph +$
719+121:4 name each
720+121:9 glyph |$
721+121:12 glyph [
722+121:13 tight tvar A
723+121:15 tvar B
724+121:16 tight glyph ]
725+122:3 INDENT
726+122:3 glyph [
727+122:4 tight lit %|
715−119:7 name p
728+122:7 name p
716−119:8 tight glyph =
729+122:8 tight glyph =
717−119:9 tight tvar B
730+122:9 tight tvar B
718−119:10 tight glyph ]
731+122:10 tight glyph ]
719−120:3 NEWLINE
732+123:3 NEWLINE
720−120:3 glyph [
733+123:3 glyph [
721−120:4 tight lit %&
734+123:4 tight lit %&
722−120:7 name p
735+123:7 name p
723−120:8 tight glyph =
736+123:8 tight glyph =
724−120:9 tight tvar A
737+123:9 tight tvar A
725−120:10 tight glyph ]
738+123:10 tight glyph ]
726−122:1 DEDENT
739+125:1 DEDENT
727−122:1 NEWLINE
740+125:1 NEWLINE
728−122:1 glyph +$
741+125:1 glyph +$
729−122:4 name bloq
742+125:4 name bloq
730−122:9 aura @
743+125:9 aura @
731−124:1 NEWLINE
744+127:1 NEWLINE
732−124:1 glyph ++
745+127:1 glyph ++
733−124:4 name some
746+127:4 name some
734−124:9 glyph |=
747+127:9 glyph |=
735−124:12 name item
748+127:12 name item
736−124:16 tight glyph =
749+127:16 tight glyph =
737−124:17 tight tvar A
750+127:17 tight tvar A
738−124:19 glyph `
751+127:19 glyph `
739−124:20 tight name item
752+127:20 tight name item
740−126:1 NEWLINE
741−126:1 glyph ++
742−126:4 name lure
743−126:9 glyph |=
744−126:12 name item
745−126:16 tight glyph =
746−126:17 tight tvar A
747−127:3 INDENT
748−127:3 glyph ^-
749−127:6 glyph (
750−127:7 tight name list
751−127:12 tvar A
752−127:13 tight glyph )
753−127:15 glyph [
754−127:16 tight name item
755−127:21 lit ~
756−127:22 tight glyph ]
757−129:1 DEDENT
758129:1 NEWLINE
753129:1 NEWLINE
759129:1 glyph ++
754129:1 glyph ++
760−129:4 name snoc
755+129:4 name lure
761129:9 glyph |=
756129:9 glyph |=
762−129:12 name args
757+129:12 name item
763129:16 tight glyph =
758129:16 tight glyph =
764−129:17 tight glyph [
759+129:17 tight tvar A
765−129:18 tight glyph (
766−129:19 tight name list
767−129:24 tvar A
768−129:25 tight glyph )
769−129:27 tvar A
770−129:28 tight glyph ]
771130:3 INDENT
760130:3 INDENT
772−130:3 glyph ?-
761+130:3 glyph ^-
773−130:6 name args
762+130:6 glyph (
774−131:5 INDENT
763+130:7 tight name list
775−131:5 glyph [
764+130:12 tvar A
776−131:6 tight name xs
765+130:13 tight glyph )
777−131:9 name item
766+130:15 glyph [
778−131:13 tight glyph ]
767+130:16 tight name item
779−131:15 glyph (
768+130:21 lit ~
780−131:16 tight name weld
769+130:22 tight glyph ]
781−131:21 name xs
770+132:1 DEDENT
782−131:24 glyph [
771+132:1 NEWLINE
783−131:25 tight name item
772+132:1 glyph ++
784−131:30 lit ~
773+132:4 name snoc
785−131:31 tight glyph ]
774+132:9 glyph |=
786−131:32 tight glyph )
775+132:12 name args
787−133:1 DEDENT
776+132:16 tight glyph =
788−133:1 DEDENT
777+132:17 tight glyph [
789−133:1 NEWLINE
778+132:18 tight glyph (
790−133:1 glyph ++
779+132:19 tight name list
791−133:4 name flop
780+132:24 tvar A
792−133:9 glyph |=
781+132:25 tight glyph )
793−133:12 name xs
782+132:27 tvar A
794−133:14 tight glyph =
783+132:28 tight glyph ]
795−133:15 tight glyph (
784+133:3 INDENT
796−133:16 tight name list
785+133:3 glyph ?-
797−133:21 tvar A
786+133:6 name args
798−133:22 tight glyph )
787+134:5 INDENT
799−134:3 INDENT
788+134:5 glyph [
800−134:3 glyph ++
789+134:6 tight name xs
801−134:6 name reverse-into
790+134:9 name item
802−134:19 glyph |=
791+134:13 tight glyph ]
803−134:22 name args
792+134:15 glyph (
804−134:26 tight glyph =
793+134:16 tight name weld
805−134:27 tight glyph [
794+134:21 name xs
806−134:28 tight glyph (
795+134:24 glyph [
807−134:29 tight name list
796+134:25 tight name item
808−134:34 tvar A
797+134:30 lit ~
809−134:35 tight glyph )
798+134:31 tight glyph ]
810−134:37 glyph (
799+134:32 tight glyph )
811−134:38 tight name list
800+136:1 DEDENT
812−134:43 tvar A
801+136:1 DEDENT
813−134:44 tight glyph )
802+136:1 NEWLINE
814−134:45 tight glyph ]
803+136:1 glyph ++
815−135:5 INDENT
804+136:4 name flop
816−135:5 glyph ?-
805+136:9 glyph |=
817−135:8 name args
806+136:12 name xs
818−136:7 INDENT
807+136:14 tight glyph =
819−136:7 glyph [
808+136:15 tight glyph (
820−136:8 tight name rest
809+136:16 tight name list
821−136:13 name acc
810+136:21 tvar A
822−136:16 tight glyph ]
811+136:22 tight glyph )
823−137:9 INDENT
812+137:3 INDENT
824−137:9 glyph ?-
813+137:3 glyph ++
825−137:12 name rest
814+137:6 name reverse-into
826−138:11 INDENT
815+137:19 glyph |=
827−138:11 lit ~
816+137:22 name args
828−138:13 name acc
817+137:26 tight glyph =
829−139:11 NEWLINE
818+137:27 tight glyph [
830−139:11 glyph [
819+137:28 tight glyph (
831−139:12 tight name item
820+137:29 tight name list
832−139:17 name more
821+137:34 tvar A
833−139:21 tight glyph ]
822+137:35 tight glyph )
834−139:23 glyph (
823+137:37 glyph (
835−139:24 tight name reverse-into
824+137:38 tight name list
836−139:37 name more
825+137:43 tvar A
837−139:42 glyph [
826+137:44 tight glyph )
838−139:43 tight name item
827+137:45 tight glyph ]
839−139:48 name acc
828+138:5 INDENT
840−139:51 tight glyph ]
829+138:5 glyph ?-
841−139:52 tight glyph )
830+138:8 name args
842−140:3 DEDENT
831+139:7 INDENT
843−140:3 DEDENT
832+139:7 glyph [
844−140:3 DEDENT
833+139:8 tight name rest
845−140:3 DEDENT
834+139:13 name acc
846−140:3 NEWLINE
835+139:16 tight glyph ]
847−140:3 glyph (
836+140:9 INDENT
848−140:4 tight name reverse-into
837+140:9 glyph ?-
849−140:17 name xs
838+140:12 name rest
850−140:20 lit ~
839+141:11 INDENT
851−140:21 tight glyph )
840+141:11 lit ~
852−142:1 DEDENT
841+141:13 name acc
853−142:1 NEWLINE
842+142:11 NEWLINE
854−142:1 glyph ++
843+142:11 glyph [
855−142:4 name drop
844+142:12 tight name item
856−142:9 glyph |=
845+142:17 name more
857−142:12 name maybe
846+142:21 tight glyph ]
858−142:17 tight glyph =
847+142:23 glyph (
859−142:18 tight glyph (
848+142:24 tight name reverse-into
860−142:19 tight name unit
849+142:37 name more
861−142:24 tvar A
850+142:42 glyph [
862−142:25 tight glyph )
851+142:43 tight name item
863−143:3 INDENT
852+142:48 name acc
864−143:3 glyph ?-
853+142:51 tight glyph ]
865−143:6 name maybe
854+142:52 tight glyph )
866−144:5 INDENT
855+143:3 DEDENT
867−144:5 lit ~
856+143:3 DEDENT
868−144:7 lit ~
857+143:3 DEDENT
869−145:5 NEWLINE
858+143:3 DEDENT
870−145:5 glyph [
859+143:3 NEWLINE
871−145:6 tight lit ~
860+143:3 glyph (
872−145:8 name value
861+143:4 tight name reverse-into
873−145:13 tight glyph ]
862+143:17 name xs
874−145:15 glyph [
863+143:20 lit ~
875−145:16 tight name value
864+143:21 tight glyph )
876−145:22 lit ~
865+145:1 DEDENT
877−145:23 tight glyph ]
866+145:1 NEWLINE
878−147:1 DEDENT
867+145:1 glyph ++
879−147:1 DEDENT
868+145:4 name drop
880−147:1 NEWLINE
869+145:9 glyph |=
881−147:1 glyph ++
870+145:12 name maybe
882−147:4 name bind
871+145:17 tight glyph =
883−147:9 glyph |=
872+145:18 tight glyph (
884−147:12 name args
873+145:19 tight name unit
885−147:16 tight glyph =
874+145:24 tvar A
886−147:17 tight glyph [
875+145:25 tight glyph )
887−147:18 tight glyph (
876+146:3 INDENT
888−147:19 tight name unit
877+146:3 glyph ?-
889−147:24 tvar A
878+146:6 name maybe
890−147:25 tight glyph )
879+147:5 INDENT
891−147:27 glyph $-(
880+147:5 lit ~
892−147:30 tight tvar A
881+147:7 lit ~
893−147:32 tvar B
882+148:5 NEWLINE
894−147:33 tight glyph )
883+148:5 glyph [
895−147:34 tight glyph ]
884+148:6 tight lit ~
896−148:3 INDENT
885+148:8 name value
897−148:3 glyph ?-
886+148:13 tight glyph ]
898−148:6 name args
887+148:15 glyph [
899−149:5 INDENT
888+148:16 tight name value
900−149:5 glyph [
889+148:22 lit ~
901−149:6 tight name maybe
890+148:23 tight glyph ]
902−149:12 name f
891+150:1 DEDENT
903−149:13 tight glyph ]
892+150:1 DEDENT
904−149:15 glyph ^-
893+150:1 NEWLINE
905−149:18 glyph (
894+150:1 glyph ++
906−149:19 tight name unit
895+150:4 name bind
907−149:24 tvar B
896+150:9 glyph |=
908−149:25 tight glyph )
897+150:12 name args
909−150:7 INDENT
898+150:16 tight glyph =
910−150:7 glyph ?-
899+150:17 tight glyph [
911−150:10 name maybe
900+150:18 tight glyph (
912−151:9 INDENT
901+150:19 tight name unit
913−151:9 lit ~
902+150:24 tvar A
914−151:11 lit ~
903+150:25 tight glyph )
915−152:9 NEWLINE
904+150:27 glyph $-(
916−152:9 glyph [
905+150:30 tight tvar A
917−152:10 tight lit ~
906+150:32 tvar B
918−152:12 name value
907+150:33 tight glyph )
919−152:17 tight glyph ]
908+150:34 tight glyph ]
920−152:19 glyph `
909+151:3 INDENT
921−152:20 tight glyph (
910+151:3 glyph ?-
922−152:21 tight name f
911+151:6 name args
923−152:23 name value
912+152:5 INDENT
924−152:28 tight glyph )
913+152:5 glyph [
925−154:1 DEDENT
914+152:6 tight name maybe
926−154:1 DEDENT
915+152:12 name f
927−154:1 DEDENT
916+152:13 tight glyph ]
928−154:1 DEDENT
917+152:15 glyph ^-
929−154:1 NEWLINE
918+152:18 glyph (
930−154:1 glyph ++
919+152:19 tight name unit
931−154:4 name biff
920+152:24 tvar B
932−154:9 glyph |=
921+152:25 tight glyph )
933−154:12 name args
922+153:7 INDENT
934−154:16 tight glyph =
923+153:7 glyph ?-
935−154:17 tight glyph [
924+153:10 name maybe
936−154:18 tight glyph (
925+154:9 INDENT
937−154:19 tight name unit
926+154:9 lit ~
938−154:24 tvar A
927+154:11 lit ~
939−154:25 tight glyph )
928+155:9 NEWLINE
940−154:27 glyph $-(
929+155:9 glyph [
941−154:30 tight tvar A
930+155:10 tight lit ~
942−154:32 glyph (
931+155:12 name value
943−154:33 tight name unit
932+155:17 tight glyph ]
944−154:38 tvar B
933+155:19 glyph `
945−154:39 tight glyph )
934+155:20 tight glyph (
946−154:40 tight glyph )
935+155:21 tight name f
947−154:41 tight glyph ]
936+155:23 name value
948−155:3 INDENT
937+155:28 tight glyph )
949−155:3 glyph ?-
938+157:1 DEDENT
950−155:6 name args
939+157:1 DEDENT
951−156:5 INDENT
940+157:1 DEDENT
952−156:5 glyph [
941+157:1 DEDENT
953−156:6 tight name maybe
942+157:1 NEWLINE
954−156:12 name f
943+157:1 glyph ++
955−156:13 tight glyph ]
944+157:4 name biff
956−156:15 glyph ^-
945+157:9 glyph |=
957−156:18 glyph (
946+157:12 name args
958−156:19 tight name unit
947+157:16 tight glyph =
959−156:24 tvar B
948+157:17 tight glyph [
960−156:25 tight glyph )
949+157:18 tight glyph (
961−157:7 INDENT
950+157:19 tight name unit
962−157:7 glyph ?-
951+157:24 tvar A
963−157:10 name maybe
952+157:25 tight glyph )
964−158:9 INDENT
953+157:27 glyph $-(
965−158:9 lit ~
954+157:30 tight tvar A
966−158:11 lit ~
955+157:32 glyph (
967−159:9 NEWLINE
956+157:33 tight name unit
968−159:9 glyph [
957+157:38 tvar B
969−159:10 tight lit ~
958+157:39 tight glyph )
970−159:12 name value
959+157:40 tight glyph )
971−159:17 tight glyph ]
960+157:41 tight glyph ]
972−159:19 glyph (
961+158:3 INDENT
973−159:20 tight name f
962+158:3 glyph ?-
974−159:22 name value
963+158:6 name args
975−159:27 tight glyph )
964+159:5 INDENT
976−161:1 DEDENT
965+159:5 glyph [
977−161:1 DEDENT
966+159:6 tight name maybe
978−161:1 DEDENT
967+159:12 name f
979−161:1 DEDENT
968+159:13 tight glyph ]
980−161:1 NEWLINE
969+159:15 glyph ^-
981−161:1 glyph ++
970+159:18 glyph (
982−161:4 name both
971+159:19 tight name unit
983−161:9 glyph |=
972+159:24 tvar B
984−161:12 name args
973+159:25 tight glyph )
985−161:16 tight glyph =
974+160:7 INDENT
986−161:17 tight glyph [
975+160:7 glyph ?-
987−161:18 tight glyph (
976+160:10 name maybe
988−161:19 tight name unit
977+161:9 INDENT
989−161:24 tvar A
978+161:9 lit ~
990−161:25 tight glyph )
979+161:11 lit ~
991−161:27 glyph (
980+162:9 NEWLINE
992−161:28 tight name unit
981+162:9 glyph [
993−161:33 tvar B
982+162:10 tight lit ~
994−161:34 tight glyph )
983+162:12 name value
995−161:35 tight glyph ]
984+162:17 tight glyph ]
996−162:3 INDENT
985+162:19 glyph (
997−162:3 glyph ?-
986+162:20 tight name f
998−162:6 name args
987+162:22 name value
999−163:5 INDENT
988+162:27 tight glyph )
1000−163:5 glyph [
989+164:1 DEDENT
1001−163:6 tight name first
990+164:1 DEDENT
1002−163:12 name second
991+164:1 DEDENT
1003−163:18 tight glyph ]
992+164:1 DEDENT
1004−163:20 glyph ^-
993+164:1 NEWLINE
1005−163:23 glyph (
994+164:1 glyph ++
1006−163:24 tight name unit
995+164:4 name both
1007−163:29 glyph [
996+164:9 glyph |=
1008−163:30 tight tvar A
997+164:12 name args
1009−163:32 tvar B
998+164:16 tight glyph =
1010−163:33 tight glyph ]
999+164:17 tight glyph [
1011−163:34 tight glyph )
1000+164:18 tight glyph (
1012−164:7 INDENT
1001+164:19 tight name unit
1013−164:7 glyph ?-
1002+164:24 tvar A
1014−164:10 name first
1003+164:25 tight glyph )
1015−165:9 INDENT
1004+164:27 glyph (
1016−165:9 lit ~
1005+164:28 tight name unit
1017−165:11 lit ~
1006+164:33 tvar B
1018−166:9 NEWLINE
1007+164:34 tight glyph )
1019−166:9 glyph [
1008+164:35 tight glyph ]
1020−166:10 tight lit ~
1009+165:3 INDENT
1021−166:12 name a
1010+165:3 glyph ?-
1022−166:13 tight glyph ]
1011+165:6 name args
1023−167:11 INDENT
1012+166:5 INDENT
1024−167:11 glyph ?-
1013+166:5 glyph [
1025−167:14 name second
1014+166:6 tight name first
1026−168:13 INDENT
1015+166:12 name second
1027−168:13 lit ~
1016+166:18 tight glyph ]
1028−168:15 lit ~
1017+166:20 glyph ^-
1029−169:13 NEWLINE
1018+166:23 glyph (
1030−169:13 glyph [
1019+166:24 tight name unit
1031−169:14 tight lit ~
1020+166:29 glyph [
1032−169:16 name b
1021+166:30 tight tvar A
1033−169:17 tight glyph ]
1022+166:32 tvar B
1034−169:19 glyph `
1023+166:33 tight glyph ]
1035−169:20 tight glyph [
1024+166:34 tight glyph )
1036−169:21 tight name a
1025+167:7 INDENT
1037−169:23 name b
1026+167:7 glyph ?-
1038−169:24 tight glyph ]
1027+167:10 name first
1039−171:1 DEDENT
1028+168:9 INDENT
1040−171:1 DEDENT
1029+168:9 lit ~
1041−171:1 DEDENT
1030+168:11 lit ~
1042−171:1 DEDENT
1031+169:9 NEWLINE
1043−171:1 DEDENT
1032+169:9 glyph [
1044−171:1 DEDENT
1033+169:10 tight lit ~
1045−171:1 NEWLINE
1034+169:12 name a
1046−171:1 glyph ++
1035+169:13 tight glyph ]
1047−171:4 name clap
1036+170:11 INDENT
1048−171:9 glyph |=
1037+170:11 glyph ?-
1049−171:12 name args
1038+170:14 name second
1050−171:16 tight glyph =
1039+171:13 INDENT
1051−171:17 tight glyph [
1040+171:13 lit ~
1052−171:18 tight glyph (
1041+171:15 lit ~
1053−171:19 tight name unit
1042+172:13 NEWLINE
1054−171:24 tvar A
1043+172:13 glyph [
1055−171:25 tight glyph )
1044+172:14 tight lit ~
1056−171:27 glyph (
1045+172:16 name b
1057−171:28 tight name unit
1046+172:17 tight glyph ]
1058−171:33 tvar A
1047+172:19 glyph `
1059−171:34 tight glyph )
1048+172:20 tight glyph [
1060−171:36 glyph $-(
1049+172:21 tight name a
1061−171:39 tight glyph [
1050+172:23 name b
1062−171:40 tight tvar A
1051+172:24 tight glyph ]
1063−171:42 tvar A
1052+174:1 DEDENT
1064−171:43 tight glyph ]
1053+174:1 DEDENT
1065−171:45 tvar A
1054+174:1 DEDENT
1066−171:46 tight glyph )
1055+174:1 DEDENT
1067−171:47 tight glyph ]
1056+174:1 DEDENT
1068−172:3 INDENT
1057+174:1 DEDENT
1069−172:3 glyph ?-
1058+174:1 NEWLINE
1070−172:6 name args
1059+174:1 glyph ++
1071−173:5 INDENT
1060+174:4 name clap
1072−173:5 glyph [
1061+174:9 glyph |=
1073−173:6 tight name first
1062+174:12 name args
1074−173:12 name second
1063+174:16 tight glyph =
1075−173:19 name combine
1064+174:17 tight glyph [
1076−173:26 tight glyph ]
1065+174:18 tight glyph (
1077−173:28 glyph ^-
1066+174:19 tight name unit
1078−173:31 glyph (
1067+174:24 tvar A
1079−173:32 tight name unit
1068+174:25 tight glyph )
1080−173:37 tvar A
1069+174:27 glyph (
1081−173:38 tight glyph )
1070+174:28 tight name unit
1082−174:7 INDENT
1071+174:33 tvar A
1083−174:7 glyph ?-
1072+174:34 tight glyph )
1084−174:10 name first
1073+174:36 glyph $-(
1085−175:9 INDENT
1074+174:39 tight glyph [
1086−175:9 lit ~
1075+174:40 tight tvar A
1087−175:11 name second
1076+174:42 tvar A
1088−176:9 NEWLINE
1077+174:43 tight glyph ]
1089−176:9 glyph [
1078+174:45 tvar A
1090−176:10 tight lit ~
1079+174:46 tight glyph )
1091−176:12 name a
1080+174:47 tight glyph ]
1092−176:13 tight glyph ]
1081+175:3 INDENT
1093−177:11 INDENT
1082+175:3 glyph ?-
1094−177:11 glyph ?-
1083+175:6 name args
1095−177:14 name second
1084+176:5 INDENT
1096−178:13 INDENT
1085+176:5 glyph [
1097−178:13 lit ~
1086+176:6 tight name first
1098−178:15 name first
1087+176:12 name second
1099−179:13 NEWLINE
1088+176:19 name combine
1100−179:13 glyph [
1089+176:26 tight glyph ]
1101−179:14 tight lit ~
1090+176:28 glyph ^-
1102−179:16 name b
1091+176:31 glyph (
1103−179:17 tight glyph ]
1092+176:32 tight name unit
1104−179:19 glyph `
1093+176:37 tvar A
1105−179:20 tight glyph (
1094+176:38 tight glyph )
1106−179:21 tight name combine
1095+177:7 INDENT
1107−179:29 name a
1096+177:7 glyph ?-
1108−179:31 name b
1097+177:10 name first
1109−179:32 tight glyph )
1098+178:9 INDENT
1110−181:1 DEDENT
1099+178:9 lit ~
1111−181:1 DEDENT
1100+178:11 name second
1112−181:1 DEDENT
1101+179:9 NEWLINE
1113−181:1 DEDENT
1102+179:9 glyph [
1114−181:1 DEDENT
1103+179:10 tight lit ~
1115−181:1 DEDENT
1104+179:12 name a
1116−181:1 NEWLINE
1105+179:13 tight glyph ]
1117−181:1 glyph ++
1106+180:11 INDENT
1118−181:4 name clef
1107+180:11 glyph ?-
1119−181:9 glyph |=
1108+180:14 name second
1120−181:12 name args
1109+181:13 INDENT
1121−181:16 tight glyph =
1110+181:13 lit ~
1122−181:17 tight glyph [
1111+181:15 name first
1123−181:18 tight glyph (
1112+182:13 NEWLINE
1124−181:19 tight name unit
1113+182:13 glyph [
1125−181:24 tvar A
1114+182:14 tight lit ~
1126−181:25 tight glyph )
1115+182:16 name b
1127−181:27 glyph (
1116+182:17 tight glyph ]
1128−181:28 tight name unit
1117+182:19 glyph `
1129−181:33 tvar B
1118+182:20 tight glyph (
1130−181:34 tight glyph )
1119+182:21 tight name combine
1131−181:36 glyph $-(
1120+182:29 name a
1132−181:39 tight glyph [
1121+182:31 name b
1133−181:40 tight tvar A
1122+182:32 tight glyph )
1134−181:42 tvar B
1123+184:1 DEDENT
1135−181:43 tight glyph ]
1124+184:1 DEDENT
1136−181:45 glyph (
1125+184:1 DEDENT
1137−181:46 tight name unit
1126+184:1 DEDENT
1138−181:51 tvar C
1127+184:1 DEDENT
1139−181:52 tight glyph )
1128+184:1 DEDENT
1140−181:53 tight glyph )
1129+184:1 NEWLINE
1141−181:54 tight glyph ]
1130+184:1 glyph ++
1142−182:3 INDENT
1131+184:4 name clef
1143−182:3 glyph ?-
1132+184:9 glyph |=
1144−182:6 name args
1133+184:12 name args
1145−183:5 INDENT
1134+184:16 tight glyph =
1146−183:5 glyph [
1135+184:17 tight glyph [
1147−183:6 tight name first
1136+184:18 tight glyph (
1148−183:12 name second
1137+184:19 tight name unit
1149−183:19 name combine
1138+184:24 tvar A
1150−183:26 tight glyph ]
1139+184:25 tight glyph )
1151−183:28 glyph ^-
1140+184:27 glyph (
1152−183:31 glyph (
1141+184:28 tight name unit
1153−183:32 tight name unit
1142+184:33 tvar B
1154−183:37 tvar C
1143+184:34 tight glyph )
1155−183:38 tight glyph )
1144+184:36 glyph $-(
1156−184:7 INDENT
1145+184:39 tight glyph [
1157−184:7 glyph ?-
1146+184:40 tight tvar A
1158−184:10 name first
1147+184:42 tvar B
1159−185:9 INDENT
1148+184:43 tight glyph ]
1160−185:9 lit ~
1149+184:45 glyph (
1161−185:11 lit ~
1150+184:46 tight name unit
1162−186:9 NEWLINE
1151+184:51 tvar C
1163−186:9 glyph [
1152+184:52 tight glyph )
1164−186:10 tight lit ~
1153+184:53 tight glyph )
1165−186:12 name a
1154+184:54 tight glyph ]
1166−186:13 tight glyph ]
1155+185:3 INDENT
1167−187:11 INDENT
1156+185:3 glyph ?-
1168−187:11 glyph ?-
1157+185:6 name args
1169−187:14 name second
1158+186:5 INDENT
1170−188:13 INDENT
1159+186:5 glyph [
1171−188:13 lit ~
1160+186:6 tight name first
1172−188:15 lit ~
1161+186:12 name second
1173−189:13 NEWLINE
1162+186:19 name combine
1174−189:13 glyph [
1163+186:26 tight glyph ]
1175−189:14 tight lit ~
1164+186:28 glyph ^-
1176−189:16 name b
1165+186:31 glyph (
1177−189:17 tight glyph ]
1166+186:32 tight name unit
1178−189:19 glyph (
1167+186:37 tvar C
1179−189:20 tight name combine
1168+186:38 tight glyph )
1180−189:28 name a
1169+187:7 INDENT
1181−189:30 name b
1170+187:7 glyph ?-
1182−189:31 tight glyph )
1171+187:10 name first
1183−191:1 DEDENT
1172+188:9 INDENT
1184−191:1 DEDENT
1173+188:9 lit ~
1185−191:1 DEDENT
1174+188:11 lit ~
1186−191:1 DEDENT
1175+189:9 NEWLINE
1187−191:1 DEDENT
1176+189:9 glyph [
1188−191:1 DEDENT
1177+189:10 tight lit ~
1189−191:1 NEWLINE
1178+189:12 name a
1190−191:1 glyph ++
1179+189:13 tight glyph ]
1191−191:4 name skim
1180+190:11 INDENT
1192−191:9 glyph |=
1181+190:11 glyph ?-
1193−191:12 name args
1182+190:14 name second
1194−191:16 tight glyph =
1183+191:13 INDENT
1195−191:17 tight glyph [
1184+191:13 lit ~
1196−191:18 tight glyph (
1185+191:15 lit ~
1197−191:19 tight name list
1186+192:13 NEWLINE
1198−191:24 tvar A
1187+192:13 glyph [
1199−191:25 tight glyph )
1188+192:14 tight lit ~
1200−191:27 glyph $-(
1189+192:16 name b
1201−191:30 tight tvar A
1190+192:17 tight glyph ]
1202−191:32 glyph ?
1191+192:19 glyph (
1203−191:33 tight glyph )
1192+192:20 tight name combine
1204−191:34 tight glyph ]
1193+192:28 name a
1205−192:3 INDENT
1194+192:30 name b
1206−192:3 glyph ?-
1195+192:31 tight glyph )
1207−192:6 name args
1196+194:1 DEDENT
1208−193:5 INDENT
1197+194:1 DEDENT
1209−193:5 glyph [
1198+194:1 DEDENT
1210−193:6 tight name xs
1199+194:1 DEDENT
1211−193:9 name predicate
1200+194:1 DEDENT
1212−193:18 tight glyph ]
1201+194:1 DEDENT
1213−194:7 INDENT
1202+194:1 NEWLINE
1214−194:7 glyph ?-
1203+194:1 glyph ++
1215−194:10 name xs
1204+194:4 name skim
1216−195:9 INDENT
1205+194:9 glyph |=
1217−195:9 lit ~
1206+194:12 name args
1218−195:11 lit ~
1207+194:16 tight glyph =
1219−196:9 NEWLINE
1208+194:17 tight glyph [
1220−196:9 glyph [
1209+194:18 tight glyph (
1221−196:10 tight name item
1210+194:19 tight name list
1222−196:15 name rest
1211+194:24 tvar A
1223−196:19 tight glyph ]
1212+194:25 tight glyph )
1224−197:11 INDENT
1213+194:27 glyph $-(
1225−197:11 glyph ?-
1214+194:30 tight tvar A
1226−197:14 glyph (
1215+194:32 glyph ?
1227−197:15 tight name predicate
1216+194:33 tight glyph )
1228−197:25 name item
1217+194:34 tight glyph ]
1229−197:29 tight glyph )
1218+195:3 INDENT
1230−198:13 INDENT
1219+195:3 glyph ?-
1231−198:13 lit %.y
1220+195:6 name args
1232−198:17 glyph [
1221+196:5 INDENT
1233−198:18 tight name item
1222+196:5 glyph [
1234−198:23 glyph (
1223+196:6 tight name xs
1235−198:24 tight name skim
1224+196:9 name predicate
1236−198:29 name rest
1225+196:18 tight glyph ]
1237−198:34 name predicate
1226+197:7 INDENT
1238−198:43 tight glyph )
1227+197:7 glyph ?-
1239−198:44 tight glyph ]
1228+197:10 name xs
1240−199:13 NEWLINE
1229+198:9 INDENT
1241−199:13 lit %.n
1230+198:9 lit ~
1242−199:17 glyph (
1231+198:11 lit ~
1243−199:18 tight name skim
1232+199:9 NEWLINE
1244−199:23 name rest
1233+199:9 glyph [
1245−199:28 name predicate
1234+199:10 tight name item
1246−199:37 tight glyph )
1235+199:15 name rest
1247−201:1 DEDENT
1236+199:19 tight glyph ]
1248−201:1 DEDENT
1237+200:11 INDENT
1249−201:1 DEDENT
1238+200:11 glyph ?-
1250−201:1 DEDENT
1239+200:14 glyph (
1251−201:1 DEDENT
1240+200:15 tight name predicate
1252−201:1 DEDENT
1241+200:25 name item
1253−201:1 NEWLINE
1242+200:29 tight glyph )
1254−201:1 glyph ++
1243+201:13 INDENT
1255−201:4 name skip
1244+201:13 lit %.y
1256−201:9 glyph |=
1245+201:17 glyph [
1257−201:12 name args
1246+201:18 tight name item
1258−201:16 tight glyph =
1247+201:23 glyph (
1259−201:17 tight glyph [
1248+201:24 tight name skim
1260−201:18 tight glyph (
1249+201:29 name rest
1261−201:19 tight name list
1250+201:34 name predicate
1262−201:24 tvar A
1251+201:43 tight glyph )
1263−201:25 tight glyph )
1252+201:44 tight glyph ]
1264−201:27 glyph $-(
1253+202:13 NEWLINE
1265−201:30 tight tvar A
1254+202:13 lit %.n
1266−201:32 glyph ?
1255+202:17 glyph (
1267−201:33 tight glyph )
1256+202:18 tight name skim
1268−201:34 tight glyph ]
1257+202:23 name rest
1269−202:3 INDENT
1258+202:28 name predicate
1270−202:3 glyph ?-
1259+202:37 tight glyph )
1271−202:6 name args
1260+204:1 DEDENT
1272−203:5 INDENT
1261+204:1 DEDENT
1273−203:5 glyph [
1262+204:1 DEDENT
1274−203:6 tight name xs
1263+204:1 DEDENT
1275−203:9 name predicate
1264+204:1 DEDENT
1276−203:18 tight glyph ]
1265+204:1 DEDENT
1277−204:7 INDENT
1266+204:1 NEWLINE
1278−204:7 glyph ?-
1267+204:1 glyph ++
1279−204:10 name xs
1268+204:4 name skip
1280−205:9 INDENT
1269+204:9 glyph |=
1281−205:9 lit ~
1270+204:12 name args
1282−205:11 lit ~
1271+204:16 tight glyph =
1283−206:9 NEWLINE
1272+204:17 tight glyph [
1284−206:9 glyph [
1273+204:18 tight glyph (
1285−206:10 tight name item
1274+204:19 tight name list
1286−206:15 name rest
1275+204:24 tvar A
1287−206:19 tight glyph ]
1276+204:25 tight glyph )
1288−207:11 INDENT
1277+204:27 glyph $-(
1289−207:11 glyph ?-
1278+204:30 tight tvar A
1290−207:14 glyph (
1279+204:32 glyph ?
1291−207:15 tight name predicate
1280+204:33 tight glyph )
1292−207:25 name item
1281+204:34 tight glyph ]
1293−207:29 tight glyph )
1282+205:3 INDENT
1294−208:13 INDENT
1283+205:3 glyph ?-
1295−208:13 lit %.y
1284+205:6 name args
1296−208:17 glyph (
1285+206:5 INDENT
1297−208:18 tight name skip
1286+206:5 glyph [
1298−208:23 name rest
1287+206:6 tight name xs
1299−208:28 name predicate
1288+206:9 name predicate
1300−208:37 tight glyph )
1289+206:18 tight glyph ]
1301−209:13 NEWLINE
1290+207:7 INDENT
1302−209:13 lit %.n
1291+207:7 glyph ?-
1303−209:17 glyph [
1292+207:10 name xs
1304−209:18 tight name item
1293+208:9 INDENT
1305−209:23 glyph (
1294+208:9 lit ~
1306−209:24 tight name skip
1295+208:11 lit ~
1307−209:29 name rest
1296+209:9 NEWLINE
1308−209:34 name predicate
1297+209:9 glyph [
1309−209:43 tight glyph )
1298+209:10 tight name item
1310−209:44 tight glyph ]
1299+209:15 name rest
1311−211:1 DEDENT
1300+209:19 tight glyph ]
1312−211:1 DEDENT
1301+210:11 INDENT
1313−211:1 DEDENT
1302+210:11 glyph ?-
1314−211:1 DEDENT
1303+210:14 glyph (
1315−211:1 DEDENT
1304+210:15 tight name predicate
1316−211:1 DEDENT
1305+210:25 name item
1317−211:1 NEWLINE
1306+210:29 tight glyph )
1318−211:1 glyph ++
1307+211:13 INDENT
1319−211:4 name levy
1308+211:13 lit %.y
1320−211:9 glyph |=
1309+211:17 glyph (
1321−211:12 name args
1310+211:18 tight name skip
1322−211:16 tight glyph =
1311+211:23 name rest
1323−211:17 tight glyph [
1312+211:28 name predicate
1324−211:18 tight glyph (
1313+211:37 tight glyph )
1325−211:19 tight name list
1314+212:13 NEWLINE
1326−211:24 tvar A
1315+212:13 lit %.n
1327−211:25 tight glyph )
1316+212:17 glyph [
1328−211:27 glyph $-(
1317+212:18 tight name item
1329−211:30 tight tvar A
1318+212:23 glyph (
1330−211:32 glyph ?
1319+212:24 tight name skip
1331−211:33 tight glyph )
1320+212:29 name rest
1332−211:34 tight glyph ]
1321+212:34 name predicate
1333−212:3 INDENT
1322+212:43 tight glyph )
1334−212:3 glyph ?-
1323+212:44 tight glyph ]
1335−212:6 name args
1324+214:1 DEDENT
1336−213:5 INDENT
1325+214:1 DEDENT
1337−213:5 glyph [
1326+214:1 DEDENT
1338−213:6 tight name xs
1327+214:1 DEDENT
1339−213:9 name predicate
1328+214:1 DEDENT
1340−213:18 tight glyph ]
1329+214:1 DEDENT
1341−214:7 INDENT
1330+214:1 NEWLINE
1342−214:7 glyph ?-
1331+214:1 glyph ++
1343−214:10 name xs
1332+214:4 name levy
1344−215:9 INDENT
1333+214:9 glyph |=
1345−215:9 lit ~
1334+214:12 name args
1346−215:11 lit %.y
1335+214:16 tight glyph =
1347−216:9 NEWLINE
1336+214:17 tight glyph [
1348−216:9 glyph [
1337+214:18 tight glyph (
1349−216:10 tight name item
1338+214:19 tight name list
1350−216:15 name rest
1339+214:24 tvar A
1351−216:19 tight glyph ]
1340+214:25 tight glyph )
1352−217:11 INDENT
1341+214:27 glyph $-(
1353−217:11 glyph ?-
1342+214:30 tight tvar A
1354−217:14 glyph (
1343+214:32 glyph ?
1355−217:15 tight name predicate
1344+214:33 tight glyph )
1356−217:25 name item
1345+214:34 tight glyph ]
1357−217:29 tight glyph )
1346+215:3 INDENT
1358−218:13 INDENT
1347+215:3 glyph ?-
1359−218:13 lit %.y
1348+215:6 name args
1360−218:17 glyph (
1349+216:5 INDENT
1361−218:18 tight name levy
1350+216:5 glyph [
1362−218:23 name rest
1351+216:6 tight name xs
1363−218:28 name predicate
1352+216:9 name predicate
1364−218:37 tight glyph )
1353+216:18 tight glyph ]
1365−219:13 NEWLINE
1354+217:7 INDENT
1366−219:13 lit %.n
1355+217:7 glyph ?-
1367−219:17 lit %.n
1356+217:10 name xs
1368−221:1 DEDENT
1357+218:9 INDENT
1369−221:1 DEDENT
1358+218:9 lit ~
1370−221:1 DEDENT
1359+218:11 lit %.y
1371−221:1 DEDENT
1360+219:9 NEWLINE
1372−221:1 DEDENT
1361+219:9 glyph [
1373−221:1 DEDENT
1362+219:10 tight name item
1374−221:1 NEWLINE
1363+219:15 name rest
1375−221:1 glyph ++
1364+219:19 tight glyph ]
1376−221:4 name lien
1365+220:11 INDENT
1377−221:9 glyph |=
1366+220:11 glyph ?-
1378−221:12 name args
1367+220:14 glyph (
1379−221:16 tight glyph =
1368+220:15 tight name predicate
1380−221:17 tight glyph [
1369+220:25 name item
1381−221:18 tight glyph (
1370+220:29 tight glyph )
1382−221:19 tight name list
1371+221:13 INDENT
1383−221:24 tvar A
1372+221:13 lit %.y
1384−221:25 tight glyph )
1373+221:17 glyph (
1385−221:27 glyph $-(
1374+221:18 tight name levy
1386−221:30 tight tvar A
1375+221:23 name rest
1387−221:32 glyph ?
1376+221:28 name predicate
1388−221:33 tight glyph )
1377+221:37 tight glyph )
1389−221:34 tight glyph ]
1378+222:13 NEWLINE
1390−222:3 INDENT
1379+222:13 lit %.n
1391−222:3 glyph ?-
1380+222:17 lit %.n
1392−222:6 name args
1381+224:1 DEDENT
1393−223:5 INDENT
1382+224:1 DEDENT
1394−223:5 glyph [
1383+224:1 DEDENT
1395−223:6 tight name xs
1384+224:1 DEDENT
1396−223:9 name predicate
1385+224:1 DEDENT
1397−223:18 tight glyph ]
1386+224:1 DEDENT
1398−224:7 INDENT
1387+224:1 NEWLINE
1399−224:7 glyph ?-
1388+224:1 glyph ++
1400−224:10 name xs
1389+224:4 name lien
1401−225:9 INDENT
1390+224:9 glyph |=
1402−225:9 lit ~
1391+224:12 name args
1403−225:11 lit %.n
1392+224:16 tight glyph =
1404−226:9 NEWLINE
1393+224:17 tight glyph [
1405−226:9 glyph [
1394+224:18 tight glyph (
1406−226:10 tight name item
1395+224:19 tight name list
1407−226:15 name rest
1396+224:24 tvar A
1408−226:19 tight glyph ]
1397+224:25 tight glyph )
1409−227:11 INDENT
1398+224:27 glyph $-(
1410−227:11 glyph ?-
1399+224:30 tight tvar A
1411−227:14 glyph (
1400+224:32 glyph ?
1412−227:15 tight name predicate
1401+224:33 tight glyph )
1413−227:25 name item
1402+224:34 tight glyph ]
1414−227:29 tight glyph )
1403+225:3 INDENT
1415−228:13 INDENT
1404+225:3 glyph ?-
1416−228:13 lit %.y
1405+225:6 name args
1417−228:17 lit %.y
1406+226:5 INDENT
1418−229:13 NEWLINE
1407+226:5 glyph [
1419−229:13 lit %.n
1408+226:6 tight name xs
1420−229:17 glyph (
1409+226:9 name predicate
1421−229:18 tight name lien
1410+226:18 tight glyph ]
1422−229:23 name rest
1411+227:7 INDENT
1423−229:28 name predicate
1412+227:7 glyph ?-
1424−229:37 tight glyph )
1413+227:10 name xs
1425−231:1 DEDENT
1414+228:9 INDENT
1426−231:1 DEDENT
1415+228:9 lit ~
1427−231:1 DEDENT
1416+228:11 lit %.n
1428−231:1 DEDENT
1417+229:9 NEWLINE
1429−231:1 DEDENT
1418+229:9 glyph [
1430−231:1 DEDENT
1419+229:10 tight name item
1431−231:1 NEWLINE
1420+229:15 name rest
1432−231:1 glyph ++
1421+229:19 tight glyph ]
1433−231:4 name roll
1422+230:11 INDENT
1434−231:9 glyph |=
1423+230:11 glyph ?-
1435−231:12 name args
1424+230:14 glyph (
1436−231:16 tight glyph =
1425+230:15 tight name predicate
1437−231:17 tight glyph [
1426+230:25 name item
1438−231:18 tight glyph (
1427+230:29 tight glyph )
1439−231:19 tight name list
1428+231:13 INDENT
1440−231:24 tvar A
1429+231:13 lit %.y
1441−231:25 tight glyph )
1430+231:17 lit %.y
1442−231:27 tvar B
1431+232:13 NEWLINE
1443−231:29 glyph $-(
1432+232:13 lit %.n
1444−231:32 tight glyph [
1433+232:17 glyph (
1445−231:33 tight tvar A
1434+232:18 tight name lien
1446−231:35 tvar B
1435+232:23 name rest
1447−231:36 tight glyph ]
1436+232:28 name predicate
1448−231:38 tvar B
1437+232:37 tight glyph )
1449−231:39 tight glyph )
1438+234:1 DEDENT
1450−231:40 tight glyph ]
1439+234:1 DEDENT
1451−232:3 INDENT
1440+234:1 DEDENT
1452−232:3 glyph ?-
1441+234:1 DEDENT
1453−232:6 name args
1442+234:1 DEDENT
1454−233:5 INDENT
1443+234:1 DEDENT
1455−233:5 glyph [
1444+234:1 NEWLINE
1456−233:6 tight name xs
1445+234:1 glyph ++
1457−233:9 name start
1446+234:4 name roll
1458−233:15 name combine
1447+234:9 glyph |=
1459−233:22 tight glyph ]
1448+234:12 name args
1460−234:7 INDENT
1449+234:16 tight glyph =
1461−234:7 glyph ?-
1450+234:17 tight glyph [
1462−234:10 name xs
1451+234:18 tight glyph (
1463−235:9 INDENT
1452+234:19 tight name list
1464−235:9 lit ~
1453+234:24 tvar A
1465−235:11 name start
1454+234:25 tight glyph )
1466−236:9 NEWLINE
1455+234:27 tvar B
1467−236:9 glyph [
1456+234:29 glyph $-(
1468−236:10 tight name item
1457+234:32 tight glyph [
1469−236:15 name rest
1458+234:33 tight tvar A
1470−236:19 tight glyph ]
1459+234:35 tvar B
1471−236:21 glyph (
1460+234:36 tight glyph ]
1472−236:22 tight name roll
1461+234:38 tvar B
1473−236:27 name rest
1462+234:39 tight glyph )
1474−236:32 glyph (
1463+234:40 tight glyph ]
1475−236:33 tight name combine
1464+235:3 INDENT
1476−236:41 name item
1465+235:3 glyph ?-
1477−236:46 name start
1466+235:6 name args
1478−236:51 tight glyph )
1467+236:5 INDENT
1479−236:53 name combine
1468+236:5 glyph [
1480−236:60 tight glyph )
1469+236:6 tight name xs
1481−238:1 DEDENT
1470+236:9 name start
1482−238:1 DEDENT
1471+236:15 name combine
1483−238:1 DEDENT
1472+236:22 tight glyph ]
1484−238:1 DEDENT
1473+237:7 INDENT
1485−238:1 NEWLINE
1474+237:7 glyph ?-
1486−238:1 glyph ++
1475+237:10 name xs
1487−238:4 name reel
1476+238:9 INDENT
1488−238:9 glyph |=
1477+238:9 lit ~
1489−238:12 name args
1478+238:11 name start
1490−238:16 tight glyph =
1479+239:9 NEWLINE
1491−238:17 tight glyph [
1480+239:9 glyph [
1492−238:18 tight glyph (
1481+239:10 tight name item
1493−238:19 tight name list
1482+239:15 name rest
1494−238:24 tvar A
1483+239:19 tight glyph ]
1495−238:25 tight glyph )
1484+239:21 glyph (
1496−238:27 tvar B
1485+239:22 tight name roll
1497−238:29 glyph $-(
1486+239:27 name rest
1498−238:32 tight glyph [
1487+239:32 glyph (
1499−238:33 tight tvar A
1488+239:33 tight name combine
1500−238:35 tvar B
1489+239:41 name item
1501−238:36 tight glyph ]
1490+239:46 name start
1502−238:38 tvar B
1491+239:51 tight glyph )
1503−238:39 tight glyph )
1492+239:53 name combine
1504−238:40 tight glyph ]
1493+239:60 tight glyph )
1505−239:3 INDENT
1494+241:1 DEDENT
1506−239:3 glyph ?-
1495+241:1 DEDENT
1507−239:6 name args
1496+241:1 DEDENT
1508−240:5 INDENT
1497+241:1 DEDENT
1509−240:5 glyph [
1498+241:1 NEWLINE
1510−240:6 tight name xs
1499+241:1 glyph ++
1511−240:9 name start
1500+241:4 name reel
1512−240:15 name combine
1501+241:9 glyph |=
1513−240:22 tight glyph ]
1502+241:12 name args
1514−241:7 INDENT
1503+241:16 tight glyph =
1515−241:7 glyph ?-
1504+241:17 tight glyph [
1516−241:10 name xs
1505+241:18 tight glyph (
1517−242:9 INDENT
1506+241:19 tight name list
1518−242:9 lit ~
1507+241:24 tvar A
1519−242:11 name start
1508+241:25 tight glyph )
1520−243:9 NEWLINE
1509+241:27 tvar B
1521−243:9 glyph [
1510+241:29 glyph $-(
1522−243:10 tight name item
1511+241:32 tight glyph [
1523−243:15 name rest
1512+241:33 tight tvar A
1524−243:19 tight glyph ]
1513+241:35 tvar B
1525−243:21 glyph (
1514+241:36 tight glyph ]
1526−243:22 tight name combine
1515+241:38 tvar B
1527−243:30 name item
1516+241:39 tight glyph )
1528−243:35 glyph (
1517+241:40 tight glyph ]
1529−243:36 tight name reel
1518+242:3 INDENT
1530−243:41 name rest
1519+242:3 glyph ?-
1531−243:46 name start
1520+242:6 name args
1532−243:52 name combine
1521+243:5 INDENT
1533−243:59 tight glyph )
1522+243:5 glyph [
1534−243:60 tight glyph )
1523+243:6 tight name xs
1535−245:1 DEDENT
1524+243:9 name start
1536−245:1 DEDENT
1525+243:15 name combine
1537−245:1 DEDENT
1526+243:22 tight glyph ]
1538−245:1 DEDENT
1527+244:7 INDENT
1539−245:1 NEWLINE
1528+244:7 glyph ?-
1540−245:1 glyph ++
1529+244:10 name xs
1541−245:4 name flit
1530+245:9 INDENT
1542−245:9 glyph |=
1531+245:9 lit ~
1543−245:12 name predicate
1532+245:11 name start
1544−245:21 tight glyph =
1533+246:9 NEWLINE
1545−245:22 tight glyph $-(
1534+246:9 glyph [
1546−245:25 tight tvar A
1535+246:10 tight name item
1547−245:27 glyph ?
1536+246:15 name rest
1548−245:28 tight glyph )
1537+246:19 tight glyph ]
1549−246:3 INDENT
1538+246:21 glyph (
1550−246:3 glyph |=
1539+246:22 tight name combine
1551−246:6 name value
1540+246:30 name item
1552−246:11 tight glyph =
1541+246:35 glyph (
1553−246:12 tight tvar A
1542+246:36 tight name reel
1554−247:5 INDENT
1543+246:41 name rest
1555−247:5 glyph ^-
1544+246:46 name start
1556−247:8 glyph (
1545+246:52 name combine
1557−247:9 tight name unit
1546+246:59 tight glyph )
1558−247:14 tvar A
1547+246:60 tight glyph )
1559−247:15 tight glyph )
1548+248:1 DEDENT
1560−248:7 INDENT
1549+248:1 DEDENT
1561−248:7 glyph ?-
1550+248:1 DEDENT
1562−248:10 glyph (
1551+248:1 DEDENT
1563−248:11 tight name predicate
1552+248:1 NEWLINE
1564−248:21 name value
1553+248:1 glyph ++
1565−248:26 tight glyph )
1554+248:4 name flit
1566−249:9 INDENT
1555+248:9 glyph |=
1567−249:9 lit %.y
1556+248:12 name predicate
1568−249:13 glyph `
1557+248:21 tight glyph =
1569−249:14 tight name value
1558+248:22 tight glyph $-(
1570−250:9 NEWLINE
1559+248:25 tight tvar A
1571−250:9 lit %.n
1560+248:27 glyph ?
1572−250:13 lit ~
1561+248:28 tight glyph )
1573−252:1 DEDENT
1562+249:3 INDENT
1574−252:1 DEDENT
1563+249:3 glyph |=
1575−252:1 DEDENT
1564+249:6 name value
1576−252:1 DEDENT
1565+249:11 tight glyph =
1577−252:1 NEWLINE
1566+249:12 tight tvar A
1578−252:1 glyph ++
1567+250:5 INDENT
1579−252:4 name murn
1568+250:5 glyph ^-
1580−252:9 glyph |=
1569+250:8 glyph (
1581−252:12 name args
1570+250:9 tight name unit
1582−252:16 tight glyph =
1571+250:14 tvar A
1583−252:17 tight glyph [
1572+250:15 tight glyph )
1584−252:18 tight glyph (
1573+251:7 INDENT
1585−252:19 tight name list
1574+251:7 glyph ?-
1586−252:24 tvar A
1575+251:10 glyph (
1587−252:25 tight glyph )
1576+251:11 tight name predicate
1588−252:27 glyph $-(
1577+251:21 name value
1589−252:30 tight tvar A
1578+251:26 tight glyph )
1590−252:32 glyph (
1579+252:9 INDENT
1591−252:33 tight name unit
1580+252:9 lit %.y
1592−252:38 tvar B
1581+252:13 glyph `
1593−252:39 tight glyph )
1582+252:14 tight name value
1594−252:40 tight glyph )
1583+253:9 NEWLINE
1595−252:41 tight glyph ]
1584+253:9 lit %.n
1596−253:3 INDENT
1585+253:13 lit ~
1597−253:3 glyph ?-
1586+255:1 DEDENT
1598−253:6 name args
1587+255:1 DEDENT
1599−254:5 INDENT
1588+255:1 DEDENT
1600−254:5 glyph [
1589+255:1 DEDENT
1601−254:6 tight name xs
1590+255:1 NEWLINE
1602−254:9 name f
1591+255:1 glyph ++
1603−254:10 tight glyph ]
1592+255:4 name murn
1604−255:7 INDENT
1593+255:9 glyph |=
1605−255:7 glyph ?-
1594+255:12 name args
1606−255:10 name xs
1595+255:16 tight glyph =
1607−256:9 INDENT
1596+255:17 tight glyph [
1608−256:9 lit ~
1597+255:18 tight glyph (
1609−256:11 lit ~
1598+255:19 tight name list
1610−257:9 NEWLINE
1599+255:24 tvar A
1611−257:9 glyph [
1600+255:25 tight glyph )
1612−257:10 tight name item
1601+255:27 glyph $-(
1613−257:15 name rest
1602+255:30 tight tvar A
1614−257:19 tight glyph ]
1603+255:32 glyph (
1615−258:11 INDENT
1604+255:33 tight name unit
1616−258:11 glyph ?-
1605+255:38 tvar B
1617−258:14 glyph (
1606+255:39 tight glyph )
1618−258:15 tight name f
1607+255:40 tight glyph )
1619−258:17 name item
1608+255:41 tight glyph ]
1620−258:21 tight glyph )
1609+256:3 INDENT
1621−259:13 INDENT
1610+256:3 glyph ?-
1622−259:13 lit ~
1611+256:6 name args
1623−259:15 glyph (
1612+257:5 INDENT
1624−259:16 tight name murn
1613+257:5 glyph [
1625−259:21 name rest
1614+257:6 tight name xs
1626−259:26 name f
1615+257:9 name f
1627−259:27 tight glyph )
1616+257:10 tight glyph ]
1628−260:13 NEWLINE
1617+258:7 INDENT
1629−260:13 glyph [
1618+258:7 glyph ?-
1630−260:14 tight lit ~
1619+258:10 name xs
1631−260:16 name value
1620+259:9 INDENT
1632−260:21 tight glyph ]
1621+259:9 lit ~
1633−260:23 glyph [
1622+259:11 lit ~
1634−260:24 tight name value
1623+260:9 NEWLINE
1635−260:30 glyph (
1624+260:9 glyph [
1636−260:31 tight name murn
1625+260:10 tight name item
1637−260:36 name rest
1626+260:15 name rest
1638−260:41 name f
1627+260:19 tight glyph ]
1639−260:42 tight glyph )
1628+261:11 INDENT
1640−260:43 tight glyph ]
1629+261:11 glyph ?-
1641−262:1 DEDENT
1630+261:14 glyph (
1642−262:1 DEDENT
1631+261:15 tight name f
1643−262:1 DEDENT
1632+261:17 name item
1644−262:1 DEDENT
1633+261:21 tight glyph )
1645−262:1 DEDENT
1634+262:13 INDENT
1646−262:1 DEDENT
1635+262:13 lit ~
1647−262:1 NEWLINE
1636+262:15 glyph (
1648−262:1 glyph ++
1637+262:16 tight name murn
1649−262:4 name join
1638+262:21 name rest
1650−262:9 glyph |=
1639+262:26 name f
1651−262:12 name args
1652−262:16 tight glyph =
1653−262:17 tight glyph [
1654−262:18 tight tvar A
1655−262:20 glyph (
1656−262:21 tight name list
1657−262:26 tvar A
1658262:27 tight glyph )
1640262:27 tight glyph )
1641+263:13 NEWLINE
1642+263:13 glyph [
1643+263:14 tight lit ~
1644+263:16 name value
1645+263:21 tight glyph ]
1646+263:23 glyph [
1647+263:24 tight name value
1648+263:30 glyph (
1649+263:31 tight name murn
1650+263:36 name rest
1651+263:41 name f
1652+263:42 tight glyph )
1653+263:43 tight glyph ]
1654+265:1 DEDENT
1655+265:1 DEDENT
1656+265:1 DEDENT
1657+265:1 DEDENT
1658+265:1 DEDENT
1659+265:1 DEDENT
1660+265:1 NEWLINE
1661+265:1 glyph ++
1662+265:4 name join
1663+265:9 glyph |=
1664+265:12 name args
1665+265:16 tight glyph =
1666+265:17 tight glyph [
1667+265:18 tight tvar A
1668+265:20 glyph (
1669+265:21 tight name list
1670+265:26 tvar A
1671+265:27 tight glyph )
1659−262:28 tight glyph ]
1672+265:28 tight glyph ]
1660−263:3 INDENT
1673+266:3 INDENT
1661−263:3 glyph ?-
1674+266:3 glyph ?-
1662−263:6 name args
1675+266:6 name args
1663−264:5 INDENT
1676+267:5 INDENT
1664−264:5 glyph [
1677+267:5 glyph [
1665−264:6 tight name separator
1678+267:6 tight name separator
1666−264:16 name xs
1679+267:16 name xs
1667−264:18 tight glyph ]
1680+267:18 tight glyph ]
1668−265:7 INDENT
1681+268:7 INDENT
1669−265:7 glyph ?-
1682+268:7 glyph ?-
1670−265:10 name xs
1683+268:10 name xs
1671−266:9 INDENT
1684+269:9 INDENT
1672−266:9 lit ~
1685+269:9 lit ~
1673−266:11 lit ~
1686+269:11 lit ~
1674−267:9 NEWLINE
1687+270:9 NEWLINE
1675−267:9 glyph [
1688+270:9 glyph [
1676−267:10 tight name item
1689+270:10 tight name item
1677−267:15 name rest
1690+270:15 name rest
1678−267:19 tight glyph ]
1691+270:19 tight glyph ]
1679−268:11 INDENT
1692+271:11 INDENT
1680−268:11 glyph ?-
1693+271:11 glyph ?-
1681−268:14 name rest
1694+271:14 name rest
1682−269:13 INDENT
1695+272:13 INDENT
1683−269:13 lit ~
1696+272:13 lit ~
1684−269:15 glyph [
1697+272:15 glyph [
1685−269:16 tight name item
1698+272:16 tight name item
1686−269:21 lit ~
1699+272:21 lit ~
1687−269:22 tight glyph ]
1700+272:22 tight glyph ]
1688−270:13 NEWLINE
1701+273:13 NEWLINE
1689−270:13 glyph [
1702+273:13 glyph [
1690−270:14 tight name next
1703+273:14 tight name next
1691−270:19 name more
1704+273:19 name more
1692−270:23 tight glyph ]
1705+273:23 tight glyph ]
1693−270:25 glyph [
1706+273:25 glyph [
1694−270:26 tight name item
1707+273:26 tight name item
1695−270:31 glyph [
1708+273:31 glyph [
1696−270:32 tight name separator
1709+273:32 tight name separator
1697−270:42 glyph (
1710+273:42 glyph (
1698−270:43 tight name join
1711+273:43 tight name join
1699−270:48 name separator
1712+273:48 name separator
1700−270:58 name rest
1713+273:58 name rest
1701−270:62 tight glyph )
1714+273:62 tight glyph )
1702−270:63 tight glyph ]
1715+273:63 tight glyph ]
1703−270:64 tight glyph ]
1716+273:64 tight glyph ]
1704−272:1 DEDENT
1717+275:1 DEDENT
1705−272:1 DEDENT
1718+275:1 DEDENT
1706−272:1 DEDENT
1719+275:1 DEDENT
1707−272:1 DEDENT
1720+275:1 DEDENT
1708−272:1 DEDENT
1721+275:1 DEDENT
1709−272:1 DEDENT
1722+275:1 DEDENT
1710−272:1 NEWLINE
1723+275:1 NEWLINE
1711−272:1 glyph ++
1724+275:1 glyph ++
1712−272:4 name snip
1725+275:4 name snip
1713−272:9 glyph |=
1726+275:9 glyph |=
1714−272:12 name xs
1727+275:12 name xs
1715−272:14 tight glyph =
1728+275:14 tight glyph =
1716−272:15 tight glyph (
1729+275:15 tight glyph (
1717−272:16 tight name list
1730+275:16 tight name list
1718−272:21 tvar A
1731+275:21 tvar A
1719−272:22 tight glyph )
1732+275:22 tight glyph )
1720−273:3 INDENT
1733+276:3 INDENT
1721−273:3 glyph ?-
1734+276:3 glyph ?-
1722−273:6 name xs
1735+276:6 name xs
1723−274:5 INDENT
1736+277:5 INDENT
1724−274:5 lit ~
1737+277:5 lit ~
1725−274:7 lit ~
1738+277:7 lit ~
1726−275:5 NEWLINE
1739+278:5 NEWLINE
1727−275:5 glyph [
1740+278:5 glyph [
1728−275:6 tight name item
1741+278:6 tight name item
1729−275:11 name rest
1742+278:11 name rest
1730−275:15 tight glyph ]
1743+278:15 tight glyph ]
1731−276:7 INDENT
1744+279:7 INDENT
1732−276:7 glyph ?-
1745+279:7 glyph ?-
1733−276:10 name rest
1746+279:10 name rest
1734−277:9 INDENT
1747+280:9 INDENT
1735−277:9 lit ~
1748+280:9 lit ~
1736−277:11 lit ~
1749+280:11 lit ~
1737−278:9 NEWLINE
1750+281:9 NEWLINE
1738−278:9 glyph [
1751+281:9 glyph [
1739−278:10 tight name next
1752+281:10 tight name next
1740−278:15 name more
1753+281:15 name more
1741−278:19 tight glyph ]
1754+281:19 tight glyph ]
1742−278:21 glyph [
1755+281:21 glyph [
1743−278:22 tight name item
1756+281:22 tight name item
1744−278:27 glyph (
1757+281:27 glyph (
1745−278:28 tight name snip
1758+281:28 tight name snip
1746−278:33 name rest
1759+281:33 name rest
1747−278:37 tight glyph )
1760+281:37 tight glyph )
1748−278:38 tight glyph ]
1761+281:38 tight glyph ]
1749−280:1 DEDENT
1762+283:1 DEDENT
1750−280:1 DEDENT
1763+283:1 DEDENT
1751−280:1 DEDENT
1764+283:1 DEDENT
1752−280:1 DEDENT
1765+283:1 DEDENT
1753−280:1 NEWLINE
1766+283:1 NEWLINE
1754−280:1 glyph ++
1767+283:1 glyph ++
1755−280:4 name rear
1768+283:4 name rear
1756−280:9 glyph |=
1769+283:9 glyph |=
1757−280:12 name xs
1770+283:12 name xs
1758−280:14 tight glyph =
1771+283:14 tight glyph =
1759−280:15 tight glyph (
1772+283:15 tight glyph (
1760−280:16 tight name list
1773+283:16 tight name list
1761−280:21 tvar A
1774+283:21 tvar A
1762−280:22 tight glyph )
1775+283:22 tight glyph )
1763−281:3 INDENT
1776+284:3 INDENT
1764−281:3 glyph ?-
1777+284:3 glyph ?-
1765−281:6 name xs
1778+284:6 name xs
1766−282:5 INDENT
1779+285:5 INDENT
1767−282:5 lit ~
1780+285:5 lit ~
1768−282:7 glyph !!
1781+285:7 glyph !!
1769−283:5 NEWLINE
1782+286:5 NEWLINE
1770−283:5 glyph [
1783+286:5 glyph [
1771−283:6 tight name item
1784+286:6 tight name item
1772−283:11 name rest
1785+286:11 name rest
1773−283:15 tight glyph ]
1786+286:15 tight glyph ]
1774−284:7 INDENT
1787+287:7 INDENT
1775−284:7 glyph ?-
1788+287:7 glyph ?-
1776−284:10 name rest
1789+287:10 name rest
1777−285:9 INDENT
1790+288:9 INDENT
1778−285:9 lit ~
1791+288:9 lit ~
1779−285:11 name item
1792+288:11 name item
1780−286:9 NEWLINE
1793+289:9 NEWLINE
1781−286:9 glyph [
1794+289:9 glyph [
1782−286:10 tight name next
1795+289:10 tight name next
1783−286:15 name more
1796+289:15 name more
1784−286:19 tight glyph ]
1797+289:19 tight glyph ]
1785−286:21 glyph (
1798+289:21 glyph (
1786−286:22 tight name rear
1799+289:22 tight name rear
1787−286:27 name rest
1800+289:27 name rest
1788−286:31 tight glyph )
1801+289:31 tight glyph )
1789−286:32 DEDENT
1802+289:32 DEDENT
1790−286:32 DEDENT
1803+289:32 DEDENT
1791−286:32 DEDENT
1804+289:32 DEDENT
1792−286:32 DEDENT
1805+289:32 DEDENT
1793−286:32 NEWLINE
1806+289:32 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+776−774
@@ -1,778 +1,780 @@
1(module
1(module
2− (value 2:1 same
2+ (jibb 1:1 internal /lib/jibb/internal)
3+ (mold 2:1 poke (ref 2:9 poke.internal))
4+ (value 5:1 same
3− (gate 2:9
5+ (gate 5:9
4− (face 2:12 x (tvar 2:14 A))
6+ (face 5:12 x (tvar 5:14 A))
5− (wing 2:16 x)))
7+ (wing 5:16 x)))
6− (value 4:1 head
8+ (value 7:1 head
7− (gate 4:9
9+ (gate 7:9
8− (face 4:12 p
10+ (face 7:12 p
9− (cell 4:14 (tvar 4:15 A) (tvar 4:17 B)))
11+ (cell 7:14 (tvar 7:15 A) (tvar 7:17 B)))
10− (body 5:3
12+ (body 8:3
11− (branch 5:3
13+ (branch 8:3
12− (wing 5:6 p)
14+ (wing 8:6 p)
13− (arm 6:5
15+ (arm 9:5
14− (cell 6:5 (bind 6:6 a) (bind 6:8 b))
16+ (cell 9:5 (bind 9:6 a) (bind 9:8 b))
15− (wing 6:11 a))))))
17+ (wing 9:11 a))))))
16− (value 8:1 tail
18+ (value 11:1 tail
17− (gate 8:9
19+ (gate 11:9
18− (face 8:12 p
20+ (face 11:12 p
19− (cell 8:14 (tvar 8:15 A) (tvar 8:17 B)))
21+ (cell 11:14 (tvar 11:15 A) (tvar 11:17 B)))
20− (body 9:3
22+ (body 12:3
21− (branch 9:3
23+ (branch 12:3
22− (wing 9:6 p)
24+ (wing 12:6 p)
23− (arm 10:5
25+ (arm 13:5
24− (cell 10:5 (bind 10:6 a) (bind 10:8 b))
26+ (cell 13:5 (bind 13:6 a) (bind 13:8 b))
25− (wing 10:11 b))))))
27+ (wing 13:11 b))))))
26− (value 12:1 not
28+ (value 15:1 not
27− (gate 12:8
29+ (gate 15:8
28− (face 12:11 b (flag 12:13))
30+ (face 15:11 b (flag 15:13))
29− (body 13:3
31+ (body 16:3
30− (branch 13:3
32+ (branch 16:3
31− (wing 13:6 b)
33+ (wing 16:6 b)
32− (arm 14:5 (lit 14:5 %.y) (lit 14:9 %.n))
34+ (arm 17:5 (lit 17:5 %.y) (lit 17:9 %.n))
33− (arm 15:5 (lit 15:5 %.n) (lit 15:9 %.y))))))
35+ (arm 18:5 (lit 18:5 %.n) (lit 18:9 %.y))))))
34− (mold 17:1 list
36+ (mold 20:1 list
35− (generic 17:9 A
37+ (generic 20:9 A
36− (union 18:3
38+ (union 21:3
37− (const 18:3 ~)
39+ (const 21:3 ~)
38− (cell 19:3
40+ (cell 22:3
39− (face 19:4 i (tvar 19:6 A))
41+ (face 22:4 i (tvar 22:6 A))
40− (face 19:8 t
42+ (face 22:8 t
41− (apply 19:10 list (tvar 19:16 A)))))))
43+ (apply 22:10 list (tvar 22:16 A)))))))
42− (mold 21:1 unit
44+ (mold 24:1 unit
43− (generic 21:9 A
45+ (generic 24:9 A
44− (union 22:3
46+ (union 25:3
45− (const 22:3 ~)
47+ (const 25:3 ~)
46− (cell 23:3
48+ (cell 26:3
47− (const 23:4 ~)
49+ (const 26:4 ~)
48− (face 23:6 u (tvar 23:8 A))))))
50+ (face 26:6 u (tvar 26:8 A))))))
49− (value 25:1 fall
51+ (value 28:1 fall
50− (gate 25:9
52+ (gate 28:9
51− (face 25:12 args
53+ (face 28:12 args
52− (cell 25:17
54+ (cell 28:17
53− (apply 25:18 unit (tvar 25:24 A))
55+ (apply 28:18 unit (tvar 28:24 A))
54− (tvar 25:27 A)))
56+ (tvar 28:27 A)))
55− (body 26:3
57+ (body 29:3
56− (branch 26:3
58+ (branch 29:3
57− (wing 26:6 args)
59+ (wing 29:6 args)
58− (arm 27:5
60+ (arm 30:5
59− (cell 27:5 (bind 27:6 maybe) (bind 27:12 fallback))
61+ (cell 30:5 (bind 30:6 maybe) (bind 30:12 fallback))
60− (body 28:7
62+ (body 31:7
61− (branch 28:7
63+ (branch 31:7
62− (wing 28:10 maybe)
64+ (wing 31:10 maybe)
63− (arm 29:9 (lit 29:9 ~) (wing 29:11 fallback))
65+ (arm 32:9 (lit 32:9 ~) (wing 32:11 fallback))
64− (arm 30:9
66+ (arm 33:9
65− (cell 30:9 (lit 30:10 ~) (bind 30:12 value))
67+ (cell 33:9 (lit 33:10 ~) (bind 33:12 value))
66− (wing 30:19 value)))))))))
68+ (wing 33:19 value)))))))))
67− (value 32:1 need
69+ (value 35:1 need
68− (gate 32:9
70+ (gate 35:9
69− (face 32:12 maybe
71+ (face 35:12 maybe
70− (apply 32:18 unit (tvar 32:24 A)))
72+ (apply 35:18 unit (tvar 35:24 A)))
71− (body 33:3
73+ (body 36:3
72− (branch 33:3
74+ (branch 36:3
73− (wing 33:6 maybe)
75+ (wing 36:6 maybe)
74− (arm 34:5 (lit 34:5 ~) (crash 34:7))
76+ (arm 37:5 (lit 37:5 ~) (crash 37:7))
75− (arm 35:5
77+ (arm 38:5
76− (cell 35:5 (lit 35:6 ~) (bind 35:8 value))
78+ (cell 38:5 (lit 38:6 ~) (bind 38:8 value))
77− (wing 35:15 value))))))
79+ (wing 38:15 value))))))
78− (value 37:1 weld
80+ (value 40:1 weld
79− (gate 37:9
81+ (gate 40:9
80− (face 37:12 args
82+ (face 40:12 args
81− (cell 37:17
83+ (cell 40:17
82− (apply 37:18 list (tvar 37:24 A))
84+ (apply 40:18 list (tvar 40:24 A))
83− (apply 37:27 list (tvar 37:33 A))))
85+ (apply 40:27 list (tvar 40:33 A))))
84− (body 38:3
86+ (body 41:3
85− (branch 38:3
87+ (branch 41:3
86− (wing 38:6 args)
88+ (wing 41:6 args)
87− (arm 39:5
89+ (arm 42:5
88− (cell 39:5 (bind 39:6 xs) (bind 39:9 ys))
90+ (cell 42:5 (bind 42:6 xs) (bind 42:9 ys))
89− (body 40:7
91+ (body 43:7
90− (cast 40:7
92+ (cast 43:7
91− (apply 40:10 list (tvar 40:16 A))
93+ (apply 43:10 list (tvar 43:16 A))
92− (body 41:9
94+ (body 44:9
93− (branch 41:9
95+ (branch 44:9
94− (wing 41:12 xs)
96+ (wing 44:12 xs)
95− (arm 42:11 (lit 42:11 ~) (wing 42:13 ys))
97+ (arm 45:11 (lit 45:11 ~) (wing 45:13 ys))
96− (arm 43:11
98+ (arm 46:11
97− (cell 43:11 (bind 43:12 item) (bind 43:17 rest))
99+ (cell 46:11 (bind 46:12 item) (bind 46:17 rest))
98− (tuple 43:23
100+ (tuple 46:23
99− (wing 43:24 item)
101+ (wing 46:24 item)
100− (group 43:29
102+ (group 46:29
101− (call 43:30 (wing 43:30 weld) (wing 43:35 rest) (wing 43:40 ys))))))))))))))
103+ (call 46:30 (wing 46:30 weld) (wing 46:35 rest) (wing 46:40 ys))))))))))))))
102− (value 45:1 turn
104+ (value 48:1 turn
103− (gate 45:9
105+ (gate 48:9
104− (face 45:12 args
106+ (face 48:12 args
105− (cell 45:17
107+ (cell 48:17
106− (apply 45:18 list (tvar 45:24 A))
108+ (apply 48:18 list (tvar 48:24 A))
107− (fn 45:27 (tvar 45:30 A) (tvar 45:32 B))))
109+ (fn 48:27 (tvar 48:30 A) (tvar 48:32 B))))
108− (body 46:3
110+ (body 49:3
109− (branch 46:3
111+ (branch 49:3
110− (wing 46:6 args)
112+ (wing 49:6 args)
111− (arm 47:5
113+ (arm 50:5
112− (cell 47:5 (bind 47:6 xs) (bind 47:9 f))
114+ (cell 50:5 (bind 50:6 xs) (bind 50:9 f))
113− (body 48:7
115+ (body 51:7
114− (cast 48:7
116+ (cast 51:7
115− (apply 48:10 list (tvar 48:16 B))
117+ (apply 51:10 list (tvar 51:16 B))
116− (body 49:9
118+ (body 52:9
117− (branch 49:9
119+ (branch 52:9
118− (wing 49:12 xs)
120+ (wing 52:12 xs)
119− (arm 50:11 (lit 50:11 ~) (lit 50:13 ~))
121+ (arm 53:11 (lit 53:11 ~) (lit 53:13 ~))
120− (arm 51:11
122+ (arm 54:11
121− (cell 51:11 (bind 51:12 item) (bind 51:17 rest))
123+ (cell 54:11 (bind 54:12 item) (bind 54:17 rest))
122− (tuple 51:23
124+ (tuple 54:23
123− (group 51:24
125+ (group 54:24
124− (call 51:25 (wing 51:25 f) (wing 51:27 item)))
126+ (call 54:25 (wing 54:25 f) (wing 54:27 item)))
125− (group 51:33
127+ (group 54:33
126− (call 51:34 (wing 51:34 turn) (wing 51:39 rest) (wing 51:44 f))))))))))))))
128+ (call 54:34 (wing 54:34 turn) (wing 54:39 rest) (wing 54:44 f))))))))))))))
127− (mold 53:1 dime
129+ (mold 56:1 dime
128− (cell 53:9
130+ (cell 56:9
129− (face 53:10 p (aura 53:12 @ta))
131+ (face 56:10 p (aura 56:12 @ta))
130− (face 53:16 q (aura 53:18 @))))
132+ (face 56:16 q (aura 56:18 @))))
131− (mold 55:1 hair
133+ (mold 58:1 hair
132− (cell 55:9
134+ (cell 58:9
133− (face 55:10 p (aura 55:12 @ud))
135+ (face 58:10 p (aura 58:12 @ud))
134− (face 55:16 q (aura 55:18 @ud))))
136+ (face 58:16 q (aura 58:18 @ud))))
135− (mold 57:1 pint
137+ (mold 60:1 pint
136− (cell 57:9
138+ (cell 60:9
137− (face 57:10 p
139+ (face 60:10 p
138− (cell 57:12
140+ (cell 60:12
139− (face 57:13 p (aura 57:15 @))
141+ (face 60:13 p (aura 60:15 @))
140− (face 57:17 q (aura 57:19 @))))
142+ (face 60:17 q (aura 60:19 @))))
141− (face 57:22 q
143+ (face 60:22 q
142− (cell 57:24
144+ (cell 60:24
143− (face 57:25 p (aura 57:27 @))
145+ (face 60:25 p (aura 60:27 @))
144− (face 57:29 q (aura 57:31 @))))))
146+ (face 60:29 q (aura 60:31 @))))))
145− (mold 59:1 coin
147+ (mold 62:1 coin
146− (union 60:3
148+ (union 63:3
147− (cell 60:3
149+ (cell 63:3
148− (const 60:4 %$)
150+ (const 63:4 %$)
149− (face 60:7 p (ref 60:9 dime)))
151+ (face 63:7 p (ref 63:9 dime)))
150− (cell 61:3
152+ (cell 64:3
151− (const 61:4 %blob)
153+ (const 64:4 %blob)
152− (face 61:10 p (noun 61:12)))
154+ (face 64:10 p (noun 64:12)))
153− (cell 62:3
155+ (cell 65:3
154− (const 62:4 %many)
156+ (const 65:4 %many)
155− (face 62:10 p
157+ (face 65:10 p
156− (apply 62:12 list (ref 62:18 coin))))))
158+ (apply 65:12 list (ref 65:18 coin))))))
157− (mold 64:1 pair
159+ (mold 67:1 pair
158− (generic 64:9 A B
160+ (generic 67:9 A B
159− (cell 64:18
161+ (cell 67:18
160− (face 64:19 p (tvar 64:21 A))
162+ (face 67:19 p (tvar 67:21 A))
161− (face 64:23 q (tvar 64:25 B)))))
163+ (face 67:23 q (tvar 67:25 B)))))
162− (mold 66:1 trel
164+ (mold 69:1 trel
163− (generic 66:9 A B C
165+ (generic 69:9 A B C
164− (cell 66:20
166+ (cell 69:20
165− (face 66:21 p (tvar 66:23 A))
167+ (face 69:21 p (tvar 69:23 A))
166− (face 66:25 q (tvar 66:27 B))
168+ (face 69:25 q (tvar 69:27 B))
167− (face 66:29 r (tvar 66:31 C)))))
169+ (face 69:29 r (tvar 69:31 C)))))
168− (mold 68:1 qual
170+ (mold 71:1 qual
169− (generic 68:9 A B C D
171+ (generic 71:9 A B C D
170− (cell 68:22
172+ (cell 71:22
171− (face 68:23 p (tvar 68:25 A))
173+ (face 71:23 p (tvar 71:25 A))
172− (face 68:27 q (tvar 68:29 B))
174+ (face 71:27 q (tvar 71:29 B))
173− (face 68:31 r (tvar 68:33 C))
175+ (face 71:31 r (tvar 71:33 C))
174− (face 68:35 s (tvar 68:37 D)))))
176+ (face 71:35 s (tvar 71:37 D)))))
175− (mold 70:1 cord (aura 70:9 @t))
177+ (mold 73:1 cord (aura 73:9 @t))
176− (mold 72:1 knot (aura 72:9 @ta))
178+ (mold 75:1 knot (aura 75:9 @ta))
177− (mold 74:1 tape
179+ (mold 77:1 tape
178− (apply 74:9 list (aura 74:15 @tD)))
180+ (apply 77:9 list (aura 77:15 @tD)))
179− (mold 76:1 path
181+ (mold 79:1 path
180− (apply 76:9 list (ref 76:15 knot)))
182+ (apply 79:9 list (ref 79:15 knot)))
181− (mold 78:1 tank
183+ (mold 81:1 tank
182− (union 79:3
184+ (union 82:3
183− (ref 79:3 cord)
185+ (ref 82:3 cord)
184− (cell 80:3
186+ (cell 83:3
185− (const 80:4 %leaf)
187+ (const 83:4 %leaf)
186− (face 80:10 p (ref 80:12 tape)))
188+ (face 83:10 p (ref 83:12 tape)))
187− (cell 81:3
189+ (cell 84:3
188− (const 81:4 %palm)
190+ (const 84:4 %palm)
189− (face 81:10 p
191+ (face 84:10 p
190− (apply 81:12 qual (ref 81:18 tape) (ref 81:23 tape) (ref 81:28 tape) (ref 81:33 tape)))
192+ (apply 84:12 qual (ref 84:18 tape) (ref 84:23 tape) (ref 84:28 tape) (ref 84:33 tape)))
191− (face 81:39 q
193+ (face 84:39 q
192− (apply 81:41 list (ref 81:47 tank))))
194+ (apply 84:41 list (ref 84:47 tank))))
193− (cell 82:3
195+ (cell 85:3
194− (const 82:4 %rose)
196+ (const 85:4 %rose)
195− (face 82:10 p
197+ (face 85:10 p
196− (apply 82:12 trel (ref 82:18 tape) (ref 82:23 tape) (ref 82:28 tape)))
198+ (apply 85:12 trel (ref 85:18 tape) (ref 85:23 tape) (ref 85:28 tape)))
197− (face 82:34 q
199+ (face 85:34 q
198− (apply 82:36 list (ref 82:42 tank))))))
200+ (apply 85:36 list (ref 85:42 tank))))))
199− (mold 84:1 nail
201+ (mold 87:1 nail
200− (cell 84:9
202+ (cell 87:9
201− (face 84:10 p (ref 84:12 hair))
203+ (face 87:10 p (ref 87:12 hair))
202− (face 84:17 q (ref 84:19 tape))))
204+ (face 87:17 q (ref 87:19 tape))))
203− (mold 86:1 edge
205+ (mold 89:1 edge
204− (cell 86:9
206+ (cell 89:9
205− (face 86:10 p (ref 86:12 hair))
207+ (face 89:10 p (ref 89:12 hair))
206− (face 86:17 q
208+ (face 89:17 q
207− (apply 86:19 unit
209+ (apply 89:19 unit
208− (cell 86:25
210+ (cell 89:25
209− (face 86:26 p (noun 86:28))
211+ (face 89:26 p (noun 89:28))
210− (face 86:30 q (ref 86:32 nail)))))))
212+ (face 89:30 q (ref 89:32 nail)))))))
211− (mold 88:1 rule
213+ (mold 91:1 rule
212− (fn 88:9 (ref 88:12 nail) (ref 88:17 edge)))
214+ (fn 91:9 (ref 91:12 nail) (ref 91:17 edge)))
213− (mold 90:1 spot
215+ (mold 93:1 spot
214− (cell 90:9
216+ (cell 93:9
215− (face 90:10 p (ref 90:12 path))
217+ (face 93:10 p (ref 93:12 path))
216− (face 90:17 q (ref 90:19 pint))))
218+ (face 93:17 q (ref 93:19 pint))))
217− (mold 92:1 toon
219+ (mold 95:1 toon
218− (union 93:3
220+ (union 96:3
219− (cell 93:3
221+ (cell 96:3
220− (const 93:4 %0)
222+ (const 96:4 %0)
221− (face 93:7 p (noun 93:9)))
223+ (face 96:7 p (noun 96:9)))
222− (cell 94:3
224+ (cell 97:3
223− (const 94:4 %1)
225+ (const 97:4 %1)
224− (face 94:7 p (noun 94:9)))
226+ (face 97:7 p (noun 97:9)))
225− (cell 95:3
227+ (cell 98:3
226− (const 95:4 %2)
228+ (const 98:4 %2)
227− (face 95:7 p
229+ (face 98:7 p
228− (apply 95:9 list (ref 95:15 tank))))))
230+ (apply 98:9 list (ref 98:15 tank))))))
229− (mold 97:1 like
231+ (mold 100:1 like
230− (generic 97:9 A
232+ (generic 100:9 A
231− (cell 97:16
233+ (cell 100:16
232− (face 97:17 p (ref 97:19 hair))
234+ (face 100:17 p (ref 100:19 hair))
233− (face 97:24 q
235+ (face 100:24 q
234− (apply 97:26 unit
236+ (apply 100:26 unit
235− (cell 97:32
237+ (cell 100:32
236− (face 97:33 p (tvar 97:35 A))
238+ (face 100:33 p (tvar 100:35 A))
237− (face 97:37 q (ref 97:39 nail))))))))
239+ (face 100:37 q (ref 100:39 nail))))))))
238− (value 99:1 wonk
240+ (value 102:1 wonk
239− (gate 99:9
241+ (gate 102:9
240− (face 99:12 veq
242+ (face 102:12 veq
241− (apply 99:16 like (tvar 99:22 A)))
243+ (apply 102:16 like (tvar 102:22 A)))
242− (body 100:3
244+ (body 103:3
243− (branch 100:3
245+ (branch 103:3
244− (wing 100:6 q.veq)
246+ (wing 103:6 q.veq)
245− (arm 101:5 (lit 101:5 ~) (crash 101:7))
247+ (arm 104:5 (lit 104:5 ~) (crash 104:7))
246− (arm 102:5
248+ (arm 105:5
247− (cell 102:5 (lit 102:6 ~) (bind 102:8 product))
249+ (cell 105:5 (lit 105:6 ~) (bind 105:8 product))
248− (wing 102:17 p.product))))))
250+ (wing 105:17 p.product))))))
249− (mold 104:1 lone
251+ (mold 107:1 lone
250− (generic 104:9 A
252+ (generic 107:9 A
251− (cell 104:16
253+ (cell 107:16
252− (face 104:17 p (tvar 104:19 A)))))
254+ (face 107:17 p (tvar 107:19 A)))))
253− (mold 106:1 lest
255+ (mold 109:1 lest
254− (generic 106:9 A
256+ (generic 109:9 A
255− (cell 106:16
257+ (cell 109:16
256− (face 106:17 i (tvar 106:19 A))
258+ (face 109:17 i (tvar 109:19 A))
257− (face 106:21 t
259+ (face 109:21 t
258− (apply 106:23 list (tvar 106:29 A))))))
260+ (apply 109:23 list (tvar 109:29 A))))))
259− (mold 108:1 pole
261+ (mold 111:1 pole
260− (generic 108:9 A
262+ (generic 111:9 A
261− (union 109:3
263+ (union 112:3
262− (const 109:3 ~)
264+ (const 112:3 ~)
263− (cell 110:3
265+ (cell 113:3
264− (tvar 110:4 A)
266+ (tvar 113:4 A)
265− (apply 110:6 pole (tvar 110:12 A))))))
267+ (apply 113:6 pole (tvar 113:12 A))))))
266− (mold 112:1 quip
268+ (mold 115:1 quip
267− (generic 112:9 A B
269+ (generic 115:9 A B
268− (cell 112:18
270+ (cell 115:18
269− (apply 112:19 list (tvar 112:25 A))
271+ (apply 115:19 list (tvar 115:25 A))
270− (tvar 112:28 B))))
272+ (tvar 115:28 B))))
271− (mold 114:1 tree
273+ (mold 117:1 tree
272− (generic 114:9 A
274+ (generic 117:9 A
273− (union 115:3
275+ (union 118:3
274− (const 115:3 ~)
276+ (const 118:3 ~)
275− (cell 116:3
276− (face 116:4 n (tvar 116:6 A))
277− (face 116:8 l
278− (apply 116:10 tree (tvar 116:16 A)))
279− (face 116:19 r
280− (apply 116:21 tree (tvar 116:27 A)))))))
281− (mold 118:1 each
282− (generic 118:9 A B
283− (union 119:3
284 (cell 119:3
277 (cell 119:3
285− (const 119:4 %|)
278+ (face 119:4 n (tvar 119:6 A))
279+ (face 119:8 l
280+ (apply 119:10 tree (tvar 119:16 A)))
281+ (face 119:19 r
282+ (apply 119:21 tree (tvar 119:27 A)))))))
283+ (mold 121:1 each
284+ (generic 121:9 A B
285+ (union 122:3
286+ (cell 122:3
287+ (const 122:4 %|)
286− (face 119:7 p (tvar 119:9 B)))
288+ (face 122:7 p (tvar 122:9 B)))
287− (cell 120:3
289+ (cell 123:3
288− (const 120:4 %&)
290+ (const 123:4 %&)
289− (face 120:7 p (tvar 120:9 A))))))
291+ (face 123:7 p (tvar 123:9 A))))))
290− (mold 122:1 bloq (aura 122:9 @))
292+ (mold 125:1 bloq (aura 125:9 @))
291− (value 124:1 some
293+ (value 127:1 some
292− (gate 124:9
294+ (gate 127:9
293− (face 124:12 item (tvar 124:17 A))
295+ (face 127:12 item (tvar 127:17 A))
294− (unit 124:19 (wing 124:20 item))))
296+ (unit 127:19 (wing 127:20 item))))
295− (value 126:1 lure
297+ (value 129:1 lure
296− (gate 126:9
297− (face 126:12 item (tvar 126:17 A))
298− (body 127:3
299− (cast 127:3
300− (apply 127:6 list (tvar 127:12 A))
301− (tuple 127:15 (wing 127:16 item) (lit 127:21 ~))))))
302− (value 129:1 snoc
303 (gate 129:9
298 (gate 129:9
304− (face 129:12 args
299+ (face 129:12 item (tvar 129:17 A))
305− (cell 129:17
306− (apply 129:18 list (tvar 129:24 A))
307− (tvar 129:27 A)))
308 (body 130:3
300 (body 130:3
309− (branch 130:3
301+ (cast 130:3
310− (wing 130:6 args)
302+ (apply 130:6 list (tvar 130:12 A))
311− (arm 131:5
303+ (tuple 130:15 (wing 130:16 item) (lit 130:21 ~))))))
312− (cell 131:5 (bind 131:6 xs) (bind 131:9 item))
304+ (value 132:1 snoc
313− (group 131:15
305+ (gate 132:9
314− (call 131:16
306+ (face 132:12 args
315− (wing 131:16 weld)
307+ (cell 132:17
316− (wing 131:21 xs)
308+ (apply 132:18 list (tvar 132:24 A))
317− (tuple 131:24 (wing 131:25 item) (lit 131:30 ~)))))))))
309+ (tvar 132:27 A)))
318− (value 133:1 flop
310+ (body 133:3
319− (gate 133:9
311+ (branch 133:3
320− (face 133:12 xs
312+ (wing 133:6 args)
321− (apply 133:15 list (tvar 133:21 A)))
313+ (arm 134:5
322− (body 134:3
314+ (cell 134:5 (bind 134:6 xs) (bind 134:9 item))
323− (value 134:3 reverse-into
315+ (group 134:15
324− (gate 134:19
316+ (call 134:16
325− (face 134:22 args
317+ (wing 134:16 weld)
326− (cell 134:27
318+ (wing 134:21 xs)
327− (apply 134:28 list (tvar 134:34 A))
319+ (tuple 134:24 (wing 134:25 item) (lit 134:30 ~)))))))))
328− (apply 134:37 list (tvar 134:43 A))))
320+ (value 136:1 flop
329− (body 135:5
321+ (gate 136:9
330− (branch 135:5
322+ (face 136:12 xs
331− (wing 135:8 args)
323+ (apply 136:15 list (tvar 136:21 A)))
332− (arm 136:7
324+ (body 137:3
333− (cell 136:7 (bind 136:8 rest) (bind 136:13 acc))
325+ (value 137:3 reverse-into
334− (body 137:9
326+ (gate 137:19
335− (branch 137:9
327+ (face 137:22 args
336− (wing 137:12 rest)
328+ (cell 137:27
337− (arm 138:11 (lit 138:11 ~) (wing 138:13 acc))
329+ (apply 137:28 list (tvar 137:34 A))
338− (arm 139:11
330+ (apply 137:37 list (tvar 137:43 A))))
339− (cell 139:11 (bind 139:12 item) (bind 139:17 more))
331+ (body 138:5
340− (group 139:23
332+ (branch 138:5
341− (call 139:24
333+ (wing 138:8 args)
342− (wing 139:24 reverse-into)
334+ (arm 139:7
343− (wing 139:37 more)
335+ (cell 139:7 (bind 139:8 rest) (bind 139:13 acc))
344− (tuple 139:42 (wing 139:43 item) (wing 139:48 acc))))))))))))
336+ (body 140:9
345− (group 140:3
337+ (branch 140:9
346− (call 140:4 (wing 140:4 reverse-into) (wing 140:17 xs) (lit 140:20 ~))))))
338+ (wing 140:12 rest)
347− (value 142:1 drop
339+ (arm 141:11 (lit 141:11 ~) (wing 141:13 acc))
348− (gate 142:9
340+ (arm 142:11
349− (face 142:12 maybe
341+ (cell 142:11 (bind 142:12 item) (bind 142:17 more))
350− (apply 142:18 unit (tvar 142:24 A)))
342+ (group 142:23
351− (body 143:3
343+ (call 142:24
352− (branch 143:3
344+ (wing 142:24 reverse-into)
353− (wing 143:6 maybe)
345+ (wing 142:37 more)
354− (arm 144:5 (lit 144:5 ~) (lit 144:7 ~))
346+ (tuple 142:42 (wing 142:43 item) (wing 142:48 acc))))))))))))
355− (arm 145:5
347+ (group 143:3
356− (cell 145:5 (lit 145:6 ~) (bind 145:8 value))
348+ (call 143:4 (wing 143:4 reverse-into) (wing 143:17 xs) (lit 143:20 ~))))))
357− (tuple 145:15 (wing 145:16 value) (lit 145:22 ~)))))))
349+ (value 145:1 drop
358− (value 147:1 bind
350+ (gate 145:9
359− (gate 147:9
351+ (face 145:12 maybe
360− (face 147:12 args
352+ (apply 145:18 unit (tvar 145:24 A)))
361− (cell 147:17
353+ (body 146:3
362− (apply 147:18 unit (tvar 147:24 A))
354+ (branch 146:3
363− (fn 147:27 (tvar 147:30 A) (tvar 147:32 B))))
355+ (wing 146:6 maybe)
364− (body 148:3
356+ (arm 147:5 (lit 147:5 ~) (lit 147:7 ~))
365− (branch 148:3
357+ (arm 148:5
366− (wing 148:6 args)
358+ (cell 148:5 (lit 148:6 ~) (bind 148:8 value))
367− (arm 149:5
359+ (tuple 148:15 (wing 148:16 value) (lit 148:22 ~)))))))
368− (cell 149:5 (bind 149:6 maybe) (bind 149:12 f))
360+ (value 150:1 bind
369− (cast 149:15
361+ (gate 150:9
370− (apply 149:18 unit (tvar 149:24 B))
362+ (face 150:12 args
371− (body 150:7
363+ (cell 150:17
372− (branch 150:7
364+ (apply 150:18 unit (tvar 150:24 A))
373− (wing 150:10 maybe)
365+ (fn 150:27 (tvar 150:30 A) (tvar 150:32 B))))
374− (arm 151:9 (lit 151:9 ~) (lit 151:11 ~))
366+ (body 151:3
375− (arm 152:9
367+ (branch 151:3
376− (cell 152:9 (lit 152:10 ~) (bind 152:12 value))
368+ (wing 151:6 args)
377− (unit 152:19
369+ (arm 152:5
378− (group 152:20
370+ (cell 152:5 (bind 152:6 maybe) (bind 152:12 f))
379− (call 152:21 (wing 152:21 f) (wing 152:23 value)))))))))))))
371+ (cast 152:15
380− (value 154:1 biff
372+ (apply 152:18 unit (tvar 152:24 B))
381− (gate 154:9
373+ (body 153:7
382− (face 154:12 args
374+ (branch 153:7
383− (cell 154:17
375+ (wing 153:10 maybe)
384− (apply 154:18 unit (tvar 154:24 A))
376+ (arm 154:9 (lit 154:9 ~) (lit 154:11 ~))
385− (fn 154:27
377+ (arm 155:9
386− (tvar 154:30 A)
378+ (cell 155:9 (lit 155:10 ~) (bind 155:12 value))
387− (apply 154:32 unit (tvar 154:38 B)))))
379+ (unit 155:19
388− (body 155:3
380+ (group 155:20
389− (branch 155:3
381+ (call 155:21 (wing 155:21 f) (wing 155:23 value)))))))))))))
390− (wing 155:6 args)
382+ (value 157:1 biff
391− (arm 156:5
383+ (gate 157:9
392− (cell 156:5 (bind 156:6 maybe) (bind 156:12 f))
384+ (face 157:12 args
393− (cast 156:15
385+ (cell 157:17
394− (apply 156:18 unit (tvar 156:24 B))
386+ (apply 157:18 unit (tvar 157:24 A))
395− (body 157:7
387+ (fn 157:27
396− (branch 157:7
388+ (tvar 157:30 A)
397− (wing 157:10 maybe)
389+ (apply 157:32 unit (tvar 157:38 B)))))
398− (arm 158:9 (lit 158:9 ~) (lit 158:11 ~))
390+ (body 158:3
399− (arm 159:9
391+ (branch 158:3
400− (cell 159:9 (lit 159:10 ~) (bind 159:12 value))
392+ (wing 158:6 args)
401− (group 159:19
393+ (arm 159:5
402− (call 159:20 (wing 159:20 f) (wing 159:22 value))))))))))))
394+ (cell 159:5 (bind 159:6 maybe) (bind 159:12 f))
403− (value 161:1 both
395+ (cast 159:15
404− (gate 161:9
396+ (apply 159:18 unit (tvar 159:24 B))
405− (face 161:12 args
397+ (body 160:7
406− (cell 161:17
398+ (branch 160:7
407− (apply 161:18 unit (tvar 161:24 A))
399+ (wing 160:10 maybe)
408− (apply 161:27 unit (tvar 161:33 B))))
400+ (arm 161:9 (lit 161:9 ~) (lit 161:11 ~))
409− (body 162:3
401+ (arm 162:9
410− (branch 162:3
402+ (cell 162:9 (lit 162:10 ~) (bind 162:12 value))
411− (wing 162:6 args)
403+ (group 162:19
412− (arm 163:5
404+ (call 162:20 (wing 162:20 f) (wing 162:22 value))))))))))))
413− (cell 163:5 (bind 163:6 first) (bind 163:12 second))
405+ (value 164:1 both
414− (cast 163:20
406+ (gate 164:9
415− (apply 163:23 unit
407+ (face 164:12 args
416− (cell 163:29 (tvar 163:30 A) (tvar 163:32 B)))
408+ (cell 164:17
417− (body 164:7
409+ (apply 164:18 unit (tvar 164:24 A))
418− (branch 164:7
410+ (apply 164:27 unit (tvar 164:33 B))))
419− (wing 164:10 first)
411+ (body 165:3
420− (arm 165:9 (lit 165:9 ~) (lit 165:11 ~))
412+ (branch 165:3
421− (arm 166:9
413+ (wing 165:6 args)
422− (cell 166:9 (lit 166:10 ~) (bind 166:12 a))
414+ (arm 166:5
423− (body 167:11
415+ (cell 166:5 (bind 166:6 first) (bind 166:12 second))
424− (branch 167:11
416+ (cast 166:20
425− (wing 167:14 second)
417+ (apply 166:23 unit
426− (arm 168:13 (lit 168:13 ~) (lit 168:15 ~))
418+ (cell 166:29 (tvar 166:30 A) (tvar 166:32 B)))
427− (arm 169:13
419+ (body 167:7
428− (cell 169:13 (lit 169:14 ~) (bind 169:16 b))
420+ (branch 167:7
429− (unit 169:19
421+ (wing 167:10 first)
430− (tuple 169:20 (wing 169:21 a) (wing 169:23 b)))))))))))))))
422+ (arm 168:9 (lit 168:9 ~) (lit 168:11 ~))
431− (value 171:1 clap
423+ (arm 169:9
432− (gate 171:9
424+ (cell 169:9 (lit 169:10 ~) (bind 169:12 a))
433− (face 171:12 args
425+ (body 170:11
434− (cell 171:17
426+ (branch 170:11
435− (apply 171:18 unit (tvar 171:24 A))
427+ (wing 170:14 second)
436− (apply 171:27 unit (tvar 171:33 A))
428+ (arm 171:13 (lit 171:13 ~) (lit 171:15 ~))
437− (fn 171:36
429+ (arm 172:13
438− (cell 171:39 (tvar 171:40 A) (tvar 171:42 A))
430+ (cell 172:13 (lit 172:14 ~) (bind 172:16 b))
439− (tvar 171:45 A))))
431+ (unit 172:19
440− (body 172:3
432+ (tuple 172:20 (wing 172:21 a) (wing 172:23 b)))))))))))))))
441− (branch 172:3
433+ (value 174:1 clap
442− (wing 172:6 args)
434+ (gate 174:9
443− (arm 173:5
435+ (face 174:12 args
444− (cell 173:5 (bind 173:6 first) (bind 173:12 second) (bind 173:19 combine))
436+ (cell 174:17
445− (cast 173:28
437+ (apply 174:18 unit (tvar 174:24 A))
446− (apply 173:31 unit (tvar 173:37 A))
438+ (apply 174:27 unit (tvar 174:33 A))
447− (body 174:7
439+ (fn 174:36
448− (branch 174:7
440+ (cell 174:39 (tvar 174:40 A) (tvar 174:42 A))
449− (wing 174:10 first)
441+ (tvar 174:45 A))))
450− (arm 175:9 (lit 175:9 ~) (wing 175:11 second))
442+ (body 175:3
451− (arm 176:9
443+ (branch 175:3
452− (cell 176:9 (lit 176:10 ~) (bind 176:12 a))
444+ (wing 175:6 args)
453− (body 177:11
445+ (arm 176:5
454− (branch 177:11
446+ (cell 176:5 (bind 176:6 first) (bind 176:12 second) (bind 176:19 combine))
455− (wing 177:14 second)
447+ (cast 176:28
456− (arm 178:13 (lit 178:13 ~) (wing 178:15 first))
448+ (apply 176:31 unit (tvar 176:37 A))
457− (arm 179:13
449+ (body 177:7
458− (cell 179:13 (lit 179:14 ~) (bind 179:16 b))
450+ (branch 177:7
459− (unit 179:19
451+ (wing 177:10 first)
460− (group 179:20
452+ (arm 178:9 (lit 178:9 ~) (wing 178:11 second))
461− (call 179:21 (wing 179:21 combine) (wing 179:29 a) (wing 179:31 b))))))))))))))))
453+ (arm 179:9
462− (value 181:1 clef
454+ (cell 179:9 (lit 179:10 ~) (bind 179:12 a))
463− (gate 181:9
455+ (body 180:11
464− (face 181:12 args
456+ (branch 180:11
465− (cell 181:17
457+ (wing 180:14 second)
466− (apply 181:18 unit (tvar 181:24 A))
458+ (arm 181:13 (lit 181:13 ~) (wing 181:15 first))
467− (apply 181:27 unit (tvar 181:33 B))
459+ (arm 182:13
468− (fn 181:36
460+ (cell 182:13 (lit 182:14 ~) (bind 182:16 b))
469− (cell 181:39 (tvar 181:40 A) (tvar 181:42 B))
461+ (unit 182:19
470− (apply 181:45 unit (tvar 181:51 C)))))
462+ (group 182:20
471− (body 182:3
463+ (call 182:21 (wing 182:21 combine) (wing 182:29 a) (wing 182:31 b))))))))))))))))
472− (branch 182:3
464+ (value 184:1 clef
473− (wing 182:6 args)
465+ (gate 184:9
474− (arm 183:5
466+ (face 184:12 args
475− (cell 183:5 (bind 183:6 first) (bind 183:12 second) (bind 183:19 combine))
467+ (cell 184:17
476− (cast 183:28
468+ (apply 184:18 unit (tvar 184:24 A))
477− (apply 183:31 unit (tvar 183:37 C))
469+ (apply 184:27 unit (tvar 184:33 B))
478− (body 184:7
470+ (fn 184:36
479− (branch 184:7
471+ (cell 184:39 (tvar 184:40 A) (tvar 184:42 B))
480− (wing 184:10 first)
472+ (apply 184:45 unit (tvar 184:51 C)))))
481− (arm 185:9 (lit 185:9 ~) (lit 185:11 ~))
473+ (body 185:3
482− (arm 186:9
474+ (branch 185:3
483− (cell 186:9 (lit 186:10 ~) (bind 186:12 a))
475+ (wing 185:6 args)
484− (body 187:11
476+ (arm 186:5
485− (branch 187:11
477+ (cell 186:5 (bind 186:6 first) (bind 186:12 second) (bind 186:19 combine))
486− (wing 187:14 second)
478+ (cast 186:28
487− (arm 188:13 (lit 188:13 ~) (lit 188:15 ~))
479+ (apply 186:31 unit (tvar 186:37 C))
488− (arm 189:13
480+ (body 187:7
489− (cell 189:13 (lit 189:14 ~) (bind 189:16 b))
481+ (branch 187:7
490− (group 189:19
482+ (wing 187:10 first)
491− (call 189:20 (wing 189:20 combine) (wing 189:28 a) (wing 189:30 b)))))))))))))))
483+ (arm 188:9 (lit 188:9 ~) (lit 188:11 ~))
492− (value 191:1 skim
484+ (arm 189:9
493− (gate 191:9
485+ (cell 189:9 (lit 189:10 ~) (bind 189:12 a))
494− (face 191:12 args
486+ (body 190:11
495− (cell 191:17
487+ (branch 190:11
496− (apply 191:18 list (tvar 191:24 A))
488+ (wing 190:14 second)
497− (fn 191:27 (tvar 191:30 A) (flag 191:32))))
489+ (arm 191:13 (lit 191:13 ~) (lit 191:15 ~))
498− (body 192:3
490+ (arm 192:13
499− (branch 192:3
491+ (cell 192:13 (lit 192:14 ~) (bind 192:16 b))
500− (wing 192:6 args)
492+ (group 192:19
501− (arm 193:5
493+ (call 192:20 (wing 192:20 combine) (wing 192:28 a) (wing 192:30 b)))))))))))))))
502− (cell 193:5 (bind 193:6 xs) (bind 193:9 predicate))
494+ (value 194:1 skim
503− (body 194:7
495+ (gate 194:9
504− (branch 194:7
496+ (face 194:12 args
505− (wing 194:10 xs)
497+ (cell 194:17
506− (arm 195:9 (lit 195:9 ~) (lit 195:11 ~))
498+ (apply 194:18 list (tvar 194:24 A))
507− (arm 196:9
499+ (fn 194:27 (tvar 194:30 A) (flag 194:32))))
508− (cell 196:9 (bind 196:10 item) (bind 196:15 rest))
500+ (body 195:3
509− (body 197:11
501+ (branch 195:3
510− (branch 197:11
502+ (wing 195:6 args)
511− (group 197:14
503+ (arm 196:5
512− (call 197:15 (wing 197:15 predicate) (wing 197:25 item)))
504+ (cell 196:5 (bind 196:6 xs) (bind 196:9 predicate))
513− (arm 198:13
505+ (body 197:7
514− (lit 198:13 %.y)
506+ (branch 197:7
515− (tuple 198:17
507+ (wing 197:10 xs)
516− (wing 198:18 item)
508+ (arm 198:9 (lit 198:9 ~) (lit 198:11 ~))
517− (group 198:23
509+ (arm 199:9
518− (call 198:24 (wing 198:24 skim) (wing 198:29 rest) (wing 198:34 predicate)))))
510+ (cell 199:9 (bind 199:10 item) (bind 199:15 rest))
519− (arm 199:13
511+ (body 200:11
520− (lit 199:13 %.n)
512+ (branch 200:11
521− (group 199:17
513+ (group 200:14
522− (call 199:18 (wing 199:18 skim) (wing 199:23 rest) (wing 199:28 predicate))))))))))))))
514+ (call 200:15 (wing 200:15 predicate) (wing 200:25 item)))
523− (value 201:1 skip
515+ (arm 201:13
524− (gate 201:9
516+ (lit 201:13 %.y)
525− (face 201:12 args
517+ (tuple 201:17
526− (cell 201:17
518+ (wing 201:18 item)
527− (apply 201:18 list (tvar 201:24 A))
519+ (group 201:23
528− (fn 201:27 (tvar 201:30 A) (flag 201:32))))
520+ (call 201:24 (wing 201:24 skim) (wing 201:29 rest) (wing 201:34 predicate)))))
529− (body 202:3
521+ (arm 202:13
530− (branch 202:3
522+ (lit 202:13 %.n)
531− (wing 202:6 args)
523+ (group 202:17
532− (arm 203:5
524+ (call 202:18 (wing 202:18 skim) (wing 202:23 rest) (wing 202:28 predicate))))))))))))))
533− (cell 203:5 (bind 203:6 xs) (bind 203:9 predicate))
525+ (value 204:1 skip
534− (body 204:7
526+ (gate 204:9
535− (branch 204:7
527+ (face 204:12 args
536− (wing 204:10 xs)
528+ (cell 204:17
537− (arm 205:9 (lit 205:9 ~) (lit 205:11 ~))
529+ (apply 204:18 list (tvar 204:24 A))
538− (arm 206:9
530+ (fn 204:27 (tvar 204:30 A) (flag 204:32))))
539− (cell 206:9 (bind 206:10 item) (bind 206:15 rest))
531+ (body 205:3
540− (body 207:11
532+ (branch 205:3
541− (branch 207:11
533+ (wing 205:6 args)
542− (group 207:14
534+ (arm 206:5
543− (call 207:15 (wing 207:15 predicate) (wing 207:25 item)))
535+ (cell 206:5 (bind 206:6 xs) (bind 206:9 predicate))
544− (arm 208:13
536+ (body 207:7
545− (lit 208:13 %.y)
537+ (branch 207:7
546− (group 208:17
538+ (wing 207:10 xs)
547− (call 208:18 (wing 208:18 skip) (wing 208:23 rest) (wing 208:28 predicate))))
539+ (arm 208:9 (lit 208:9 ~) (lit 208:11 ~))
548− (arm 209:13
540+ (arm 209:9
549− (lit 209:13 %.n)
541+ (cell 209:9 (bind 209:10 item) (bind 209:15 rest))
550− (tuple 209:17
542+ (body 210:11
551− (wing 209:18 item)
543+ (branch 210:11
552− (group 209:23
544+ (group 210:14
553− (call 209:24 (wing 209:24 skip) (wing 209:29 rest) (wing 209:34 predicate)))))))))))))))
545+ (call 210:15 (wing 210:15 predicate) (wing 210:25 item)))
554− (value 211:1 levy
546+ (arm 211:13
555− (gate 211:9
547+ (lit 211:13 %.y)
556− (face 211:12 args
548+ (group 211:17
557− (cell 211:17
549+ (call 211:18 (wing 211:18 skip) (wing 211:23 rest) (wing 211:28 predicate))))
558− (apply 211:18 list (tvar 211:24 A))
550+ (arm 212:13
559− (fn 211:27 (tvar 211:30 A) (flag 211:32))))
551+ (lit 212:13 %.n)
560− (body 212:3
552+ (tuple 212:17
561− (branch 212:3
553+ (wing 212:18 item)
562− (wing 212:6 args)
554+ (group 212:23
563− (arm 213:5
555+ (call 212:24 (wing 212:24 skip) (wing 212:29 rest) (wing 212:34 predicate)))))))))))))))
564− (cell 213:5 (bind 213:6 xs) (bind 213:9 predicate))
556+ (value 214:1 levy
565− (body 214:7
557+ (gate 214:9
566− (branch 214:7
558+ (face 214:12 args
567− (wing 214:10 xs)
559+ (cell 214:17
568− (arm 215:9 (lit 215:9 ~) (lit 215:11 %.y))
560+ (apply 214:18 list (tvar 214:24 A))
569− (arm 216:9
561+ (fn 214:27 (tvar 214:30 A) (flag 214:32))))
570− (cell 216:9 (bind 216:10 item) (bind 216:15 rest))
562+ (body 215:3
571− (body 217:11
563+ (branch 215:3
572− (branch 217:11
564+ (wing 215:6 args)
573− (group 217:14
565+ (arm 216:5
574− (call 217:15 (wing 217:15 predicate) (wing 217:25 item)))
566+ (cell 216:5 (bind 216:6 xs) (bind 216:9 predicate))
575− (arm 218:13
567+ (body 217:7
576− (lit 218:13 %.y)
568+ (branch 217:7
577− (group 218:17
569+ (wing 217:10 xs)
578− (call 218:18 (wing 218:18 levy) (wing 218:23 rest) (wing 218:28 predicate))))
570+ (arm 218:9 (lit 218:9 ~) (lit 218:11 %.y))
579− (arm 219:13 (lit 219:13 %.n) (lit 219:17 %.n))))))))))))
571+ (arm 219:9
580− (value 221:1 lien
572+ (cell 219:9 (bind 219:10 item) (bind 219:15 rest))
581− (gate 221:9
573+ (body 220:11
582− (face 221:12 args
574+ (branch 220:11
583− (cell 221:17
575+ (group 220:14
584− (apply 221:18 list (tvar 221:24 A))
576+ (call 220:15 (wing 220:15 predicate) (wing 220:25 item)))
585− (fn 221:27 (tvar 221:30 A) (flag 221:32))))
577+ (arm 221:13
586− (body 222:3
578+ (lit 221:13 %.y)
587− (branch 222:3
579+ (group 221:17
588− (wing 222:6 args)
580+ (call 221:18 (wing 221:18 levy) (wing 221:23 rest) (wing 221:28 predicate))))
589− (arm 223:5
581+ (arm 222:13 (lit 222:13 %.n) (lit 222:17 %.n))))))))))))
590− (cell 223:5 (bind 223:6 xs) (bind 223:9 predicate))
582+ (value 224:1 lien
591− (body 224:7
583+ (gate 224:9
592− (branch 224:7
584+ (face 224:12 args
593− (wing 224:10 xs)
585+ (cell 224:17
594− (arm 225:9 (lit 225:9 ~) (lit 225:11 %.n))
586+ (apply 224:18 list (tvar 224:24 A))
595− (arm 226:9
587+ (fn 224:27 (tvar 224:30 A) (flag 224:32))))
596− (cell 226:9 (bind 226:10 item) (bind 226:15 rest))
588+ (body 225:3
597− (body 227:11
589+ (branch 225:3
598− (branch 227:11
590+ (wing 225:6 args)
599− (group 227:14
591+ (arm 226:5
600− (call 227:15 (wing 227:15 predicate) (wing 227:25 item)))
592+ (cell 226:5 (bind 226:6 xs) (bind 226:9 predicate))
601− (arm 228:13 (lit 228:13 %.y) (lit 228:17 %.y))
593+ (body 227:7
602− (arm 229:13
594+ (branch 227:7
603− (lit 229:13 %.n)
595+ (wing 227:10 xs)
604− (group 229:17
596+ (arm 228:9 (lit 228:9 ~) (lit 228:11 %.n))
605− (call 229:18 (wing 229:18 lien) (wing 229:23 rest) (wing 229:28 predicate))))))))))))))
597+ (arm 229:9
606− (value 231:1 roll
598+ (cell 229:9 (bind 229:10 item) (bind 229:15 rest))
607− (gate 231:9
599+ (body 230:11
608− (face 231:12 args
600+ (branch 230:11
609− (cell 231:17
601+ (group 230:14
610− (apply 231:18 list (tvar 231:24 A))
602+ (call 230:15 (wing 230:15 predicate) (wing 230:25 item)))
611− (tvar 231:27 B)
603+ (arm 231:13 (lit 231:13 %.y) (lit 231:17 %.y))
612− (fn 231:29
604+ (arm 232:13
613− (cell 231:32 (tvar 231:33 A) (tvar 231:35 B))
605+ (lit 232:13 %.n)
614− (tvar 231:38 B))))
606+ (group 232:17
615− (body 232:3
607+ (call 232:18 (wing 232:18 lien) (wing 232:23 rest) (wing 232:28 predicate))))))))))))))
616− (branch 232:3
608+ (value 234:1 roll
617− (wing 232:6 args)
609+ (gate 234:9
618− (arm 233:5
610+ (face 234:12 args
619− (cell 233:5 (bind 233:6 xs) (bind 233:9 start) (bind 233:15 combine))
611+ (cell 234:17
620− (body 234:7
612+ (apply 234:18 list (tvar 234:24 A))
621− (branch 234:7
613+ (tvar 234:27 B)
622− (wing 234:10 xs)
614+ (fn 234:29
623− (arm 235:9 (lit 235:9 ~) (wing 235:11 start))
615+ (cell 234:32 (tvar 234:33 A) (tvar 234:35 B))
624− (arm 236:9
616+ (tvar 234:38 B))))
625− (cell 236:9 (bind 236:10 item) (bind 236:15 rest))
617+ (body 235:3
626− (group 236:21
618+ (branch 235:3
627− (call 236:22
619+ (wing 235:6 args)
628− (wing 236:22 roll)
620+ (arm 236:5
629− (wing 236:27 rest)
621+ (cell 236:5 (bind 236:6 xs) (bind 236:9 start) (bind 236:15 combine))
630− (group 236:32
622+ (body 237:7
631− (call 236:33 (wing 236:33 combine) (wing 236:41 item) (wing 236:46 start)))
623+ (branch 237:7
632− (wing 236:53 combine)))))))))))
624+ (wing 237:10 xs)
633− (value 238:1 reel
625+ (arm 238:9 (lit 238:9 ~) (wing 238:11 start))
634− (gate 238:9
626+ (arm 239:9
635− (face 238:12 args
627+ (cell 239:9 (bind 239:10 item) (bind 239:15 rest))
636− (cell 238:17
628+ (group 239:21
637− (apply 238:18 list (tvar 238:24 A))
629+ (call 239:22
638− (tvar 238:27 B)
630+ (wing 239:22 roll)
639− (fn 238:29
631+ (wing 239:27 rest)
640− (cell 238:32 (tvar 238:33 A) (tvar 238:35 B))
632+ (group 239:32
641− (tvar 238:38 B))))
633+ (call 239:33 (wing 239:33 combine) (wing 239:41 item) (wing 239:46 start)))
642− (body 239:3
634+ (wing 239:53 combine)))))))))))
643− (branch 239:3
635+ (value 241:1 reel
644− (wing 239:6 args)
636+ (gate 241:9
645− (arm 240:5
637+ (face 241:12 args
646− (cell 240:5 (bind 240:6 xs) (bind 240:9 start) (bind 240:15 combine))
638+ (cell 241:17
647− (body 241:7
639+ (apply 241:18 list (tvar 241:24 A))
648− (branch 241:7
640+ (tvar 241:27 B)
649− (wing 241:10 xs)
641+ (fn 241:29
650− (arm 242:9 (lit 242:9 ~) (wing 242:11 start))
642+ (cell 241:32 (tvar 241:33 A) (tvar 241:35 B))
651− (arm 243:9
643+ (tvar 241:38 B))))
652− (cell 243:9 (bind 243:10 item) (bind 243:15 rest))
644+ (body 242:3
653− (group 243:21
645+ (branch 242:3
654− (call 243:22
646+ (wing 242:6 args)
655− (wing 243:22 combine)
647+ (arm 243:5
656− (wing 243:30 item)
648+ (cell 243:5 (bind 243:6 xs) (bind 243:9 start) (bind 243:15 combine))
657− (group 243:35
649+ (body 244:7
658− (call 243:36 (wing 243:36 reel) (wing 243:41 rest) (wing 243:46 start) (wing 243:52 combine)))))))))))))
650+ (branch 244:7
659− (value 245:1 flit
651+ (wing 244:10 xs)
660− (gate 245:9
652+ (arm 245:9 (lit 245:9 ~) (wing 245:11 start))
661− (face 245:12 predicate
653+ (arm 246:9
662− (fn 245:22 (tvar 245:25 A) (flag 245:27)))
654+ (cell 246:9 (bind 246:10 item) (bind 246:15 rest))
663− (body 246:3
655+ (group 246:21
664− (gate 246:3
656+ (call 246:22
665− (face 246:6 value (tvar 246:12 A))
657+ (wing 246:22 combine)
666− (body 247:5
658+ (wing 246:30 item)
667− (cast 247:5
659+ (group 246:35
668− (apply 247:8 unit (tvar 247:14 A))
660+ (call 246:36 (wing 246:36 reel) (wing 246:41 rest) (wing 246:46 start) (wing 246:52 combine)))))))))))))
669− (body 248:7
661+ (value 248:1 flit
670− (branch 248:7
662+ (gate 248:9
671− (group 248:10
663+ (face 248:12 predicate
672− (call 248:11 (wing 248:11 predicate) (wing 248:21 value)))
664+ (fn 248:22 (tvar 248:25 A) (flag 248:27)))
673− (arm 249:9
665+ (body 249:3
674− (lit 249:9 %.y)
666+ (gate 249:3
675− (unit 249:13 (wing 249:14 value)))
667+ (face 249:6 value (tvar 249:12 A))
676− (arm 250:9 (lit 250:9 %.n) (lit 250:13 ~))))))))))
668+ (body 250:5
677− (value 252:1 murn
669+ (cast 250:5
678− (gate 252:9
670+ (apply 250:8 unit (tvar 250:14 A))
679− (face 252:12 args
671+ (body 251:7
680− (cell 252:17
672+ (branch 251:7
681− (apply 252:18 list (tvar 252:24 A))
673+ (group 251:10
682− (fn 252:27
674+ (call 251:11 (wing 251:11 predicate) (wing 251:21 value)))
683− (tvar 252:30 A)
675+ (arm 252:9
684− (apply 252:32 unit (tvar 252:38 B)))))
676+ (lit 252:9 %.y)
685− (body 253:3
677+ (unit 252:13 (wing 252:14 value)))
686− (branch 253:3
678+ (arm 253:9 (lit 253:9 %.n) (lit 253:13 ~))))))))))
687− (wing 253:6 args)
679+ (value 255:1 murn
688− (arm 254:5
680+ (gate 255:9
689− (cell 254:5 (bind 254:6 xs) (bind 254:9 f))
681+ (face 255:12 args
690− (body 255:7
682+ (cell 255:17
691− (branch 255:7
683+ (apply 255:18 list (tvar 255:24 A))
692− (wing 255:10 xs)
684+ (fn 255:27
693− (arm 256:9 (lit 256:9 ~) (lit 256:11 ~))
685+ (tvar 255:30 A)
694− (arm 257:9
686+ (apply 255:32 unit (tvar 255:38 B)))))
695− (cell 257:9 (bind 257:10 item) (bind 257:15 rest))
687+ (body 256:3
696− (body 258:11
688+ (branch 256:3
697− (branch 258:11
689+ (wing 256:6 args)
698− (group 258:14
690+ (arm 257:5
699− (call 258:15 (wing 258:15 f) (wing 258:17 item)))
691+ (cell 257:5 (bind 257:6 xs) (bind 257:9 f))
700− (arm 259:13
692+ (body 258:7
701− (lit 259:13 ~)
693+ (branch 258:7
702− (group 259:15
694+ (wing 258:10 xs)
703− (call 259:16 (wing 259:16 murn) (wing 259:21 rest) (wing 259:26 f))))
695+ (arm 259:9 (lit 259:9 ~) (lit 259:11 ~))
704− (arm 260:13
696+ (arm 260:9
705− (cell 260:13 (lit 260:14 ~) (bind 260:16 value))
697+ (cell 260:9 (bind 260:10 item) (bind 260:15 rest))
706− (tuple 260:23
698+ (body 261:11
707− (wing 260:24 value)
699+ (branch 261:11
708− (group 260:30
700+ (group 261:14
709− (call 260:31 (wing 260:31 murn) (wing 260:36 rest) (wing 260:41 f)))))))))))))))
701+ (call 261:15 (wing 261:15 f) (wing 261:17 item)))
710− (value 262:1 join
702+ (arm 262:13
711− (gate 262:9
703+ (lit 262:13 ~)
712− (face 262:12 args
704+ (group 262:15
713− (cell 262:17
705+ (call 262:16 (wing 262:16 murn) (wing 262:21 rest) (wing 262:26 f))))
714− (tvar 262:18 A)
706+ (arm 263:13
715− (apply 262:20 list (tvar 262:26 A))))
707+ (cell 263:13 (lit 263:14 ~) (bind 263:16 value))
716− (body 263:3
708+ (tuple 263:23
717− (branch 263:3
709+ (wing 263:24 value)
718− (wing 263:6 args)
710+ (group 263:30
719− (arm 264:5
711+ (call 263:31 (wing 263:31 murn) (wing 263:36 rest) (wing 263:41 f)))))))))))))))
720− (cell 264:5 (bind 264:6 separator) (bind 264:16 xs))
712+ (value 265:1 join
721− (body 265:7
713+ (gate 265:9
722− (branch 265:7
714+ (face 265:12 args
723− (wing 265:10 xs)
715+ (cell 265:17
724− (arm 266:9 (lit 266:9 ~) (lit 266:11 ~))
716+ (tvar 265:18 A)
725− (arm 267:9
717+ (apply 265:20 list (tvar 265:26 A))))
726− (cell 267:9 (bind 267:10 item) (bind 267:15 rest))
718+ (body 266:3
727− (body 268:11
719+ (branch 266:3
728− (branch 268:11
720+ (wing 266:6 args)
729− (wing 268:14 rest)
721+ (arm 267:5
730− (arm 269:13
722+ (cell 267:5 (bind 267:6 separator) (bind 267:16 xs))
731− (lit 269:13 ~)
723+ (body 268:7
732− (tuple 269:15 (wing 269:16 item) (lit 269:21 ~)))
724+ (branch 268:7
733− (arm 270:13
725+ (wing 268:10 xs)
734− (cell 270:13 (bind 270:14 next) (bind 270:19 more))
726+ (arm 269:9 (lit 269:9 ~) (lit 269:11 ~))
735− (tuple 270:25
727+ (arm 270:9
736− (wing 270:26 item)
728+ (cell 270:9 (bind 270:10 item) (bind 270:15 rest))
737− (tuple 270:31
729+ (body 271:11
738− (wing 270:32 separator)
730+ (branch 271:11
739− (group 270:42
731+ (wing 271:14 rest)
740− (call 270:43 (wing 270:43 join) (wing 270:48 separator) (wing 270:58 rest))))))))))))))))
732+ (arm 272:13
741− (value 272:1 snip
733+ (lit 272:13 ~)
742− (gate 272:9
734+ (tuple 272:15 (wing 272:16 item) (lit 272:21 ~)))
743− (face 272:12 xs
735+ (arm 273:13
744− (apply 272:15 list (tvar 272:21 A)))
736+ (cell 273:13 (bind 273:14 next) (bind 273:19 more))
745− (body 273:3
737+ (tuple 273:25
746− (branch 273:3
738+ (wing 273:26 item)
747− (wing 273:6 xs)
739+ (tuple 273:31
748− (arm 274:5 (lit 274:5 ~) (lit 274:7 ~))
740+ (wing 273:32 separator)
749− (arm 275:5
741+ (group 273:42
750− (cell 275:5 (bind 275:6 item) (bind 275:11 rest))
742+ (call 273:43 (wing 273:43 join) (wing 273:48 separator) (wing 273:58 rest))))))))))))))))
751− (body 276:7
743+ (value 275:1 snip
752− (branch 276:7
744+ (gate 275:9
753− (wing 276:10 rest)
745+ (face 275:12 xs
754− (arm 277:9 (lit 277:9 ~) (lit 277:11 ~))
746+ (apply 275:15 list (tvar 275:21 A)))
755− (arm 278:9
747+ (body 276:3
756− (cell 278:9 (bind 278:10 next) (bind 278:15 more))
748+ (branch 276:3
757− (tuple 278:21
749+ (wing 276:6 xs)
758− (wing 278:22 item)
750+ (arm 277:5 (lit 277:5 ~) (lit 277:7 ~))
759− (group 278:27
751+ (arm 278:5
760− (call 278:28 (wing 278:28 snip) (wing 278:33 rest))))))))))))
752+ (cell 278:5 (bind 278:6 item) (bind 278:11 rest))
761− (value 280:1 rear
753+ (body 279:7
762− (gate 280:9
754+ (branch 279:7
763− (face 280:12 xs
755+ (wing 279:10 rest)
764− (apply 280:15 list (tvar 280:21 A)))
756+ (arm 280:9 (lit 280:9 ~) (lit 280:11 ~))
765− (body 281:3
757+ (arm 281:9
766− (branch 281:3
758+ (cell 281:9 (bind 281:10 next) (bind 281:15 more))
767− (wing 281:6 xs)
759+ (tuple 281:21
768− (arm 282:5 (lit 282:5 ~) (crash 282:7))
760+ (wing 281:22 item)
769− (arm 283:5
761+ (group 281:27
770− (cell 283:5 (bind 283:6 item) (bind 283:11 rest))
762+ (call 281:28 (wing 281:28 snip) (wing 281:33 rest))))))))))))
771− (body 284:7
763+ (value 283:1 rear
772− (branch 284:7
764+ (gate 283:9
773− (wing 284:10 rest)
765+ (face 283:12 xs
774− (arm 285:9 (lit 285:9 ~) (wing 285:11 item))
766+ (apply 283:15 list (tvar 283:21 A)))
775− (arm 286:9
767+ (body 284:3
776− (cell 286:9 (bind 286:10 next) (bind 286:15 more))
768+ (branch 284:3
777− (group 286:21
769+ (wing 284:6 xs)
778− (call 286:22 (wing 286:22 rear) (wing 286:27 rest))))))))))))
770+ (arm 285:5 (lit 285:5 ~) (crash 285:7))
771+ (arm 286:5
772+ (cell 286:5 (bind 286:6 item) (bind 286:11 rest))
773+ (body 287:7
774+ (branch 287:7
775+ (wing 287:10 rest)
776+ (arm 288:9 (lit 288:9 ~) (wing 288:11 item))
777+ (arm 289:9
778+ (cell 289:9 (bind 289:10 next) (bind 289:15 more))
779+ (group 289:21
780+ (call 289:22 (wing 289:22 rear) (wing 289:27 rest))))))))))))
tests/golden/prelude-unit-list-transforms/types.txt+1
@@ -1,4 +1,5 @@
1partial inference; module not checked
1partial inference; module not checked
2++$ poke: not checked
2++ same: $-(A A)
3++ same: $-(A A)
3++ head: $-([A B] A)
4++ head: $-([A B] A)
4++ tail: $-([A B] B)
5++ tail: $-([A B] B)
tests/golden/types-scope-library-poke/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: API and store `+$ poke` lines are declarations, not molds; no name may shadow one already in scope.
2+tests: The partial checker reports uncertain API/store scope as unsupported, while definite duplicate declarations and unrelated prelude shadowing remain errors. A library mold cannot shadow the prelude poke type.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-scope-library-poke/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the prepared prelude.
tests/golden/types-scope-library-poke/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib/library.jibb
tests/golden/types-scope-library-poke/source.jibbnew file+2
@@ -0,0 +1,2 @@
1++$ poke @t
2+++ value "ok"
tests/golden/types-scope-library-poke/tokens.txtnew file+8
@@ -0,0 +1,8 @@
1+1:1 glyph +$
2+1:4 name poke
3+1:9 aura @t
4+2:1 NEWLINE
5+2:1 glyph ++
6+2:4 name value
7+2:10 str "ok"
8+2:14 NEWLINE
tests/golden/types-scope-library-poke/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (mold 1:1 poke (aura 1:9 @t))
3+ (value 2:1 value (str 2:10 "ok")))
tests/golden/types-scope-library-poke/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module has conflicting names
tests/golden/types-scope-root-api/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: API and store `+$ poke` lines are declarations, not molds; no name may shadow one already in scope.
2+tests: The partial checker reports uncertain API/store scope as unsupported, while definite duplicate declarations and unrelated prelude shadowing remain errors. A library mold cannot shadow the prelude poke type.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-scope-root-api/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the prepared prelude.
tests/golden/types-scope-root-api/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/api/todo.jibb
tests/golden/types-scope-root-api/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/% %todo-action
2++$ poke todo-action
tests/golden/types-scope-root-api/tokens.txtnew file+7
@@ -0,0 +1,7 @@
1+1:1 glyph /%
2+1:4 lit %todo-action
3+2:1 NEWLINE
4+2:1 glyph +$
5+2:4 name poke
6+2:9 name todo-action
7+2:20 NEWLINE
tests/golden/types-scope-root-api/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (mark 1:1 %todo-action)
3+ (mold 2:1 poke (ref 2:9 todo-action)))
tests/golden/types-scope-root-api/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module kind or scope needs unsupported inference
tests/golden/types-scope-store-duplicate/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: API and store `+$ poke` lines are declarations, not molds; no name may shadow one already in scope.
2+tests: The partial checker reports uncertain API/store scope as unsupported, while definite duplicate declarations and unrelated prelude shadowing remain errors. A library mold cannot shadow the prelude poke type.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-scope-store-duplicate/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the prepared prelude.
tests/golden/types-scope-store-duplicate/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/stores/cart.jibb
tests/golden/types-scope-store-duplicate/source.jibbnew file+3
@@ -0,0 +1,3 @@
1++$ poke @t
2++$ poke @p
3+++ main (store init update)
tests/golden/types-scope-store-duplicate/tokens.txtnew file+16
@@ -0,0 +1,16 @@
1+1:1 glyph +$
2+1:4 name poke
3+1:9 aura @t
4+2:1 NEWLINE
5+2:1 glyph +$
6+2:4 name poke
7+2:9 aura @p
8+3:1 NEWLINE
9+3:1 glyph ++
10+3:4 name main
11+3:9 glyph (
12+3:10 tight name store
13+3:16 name init
14+3:21 name update
15+3:27 tight glyph )
16+3:28 NEWLINE
tests/golden/types-scope-store-duplicate/tree.txtnew file+6
@@ -0,0 +1,6 @@
1+(module
2+ (mold 1:1 poke (aura 1:9 @t))
3+ (mold 2:1 poke (aura 2:9 @p))
4+ (value 3:1 main
5+ (group 3:9
6+ (call 3:10 (wing 3:10 store) (wing 3:16 init) (wing 3:21 update)))))
tests/golden/types-scope-store-duplicate/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module has conflicting names
tests/golden/types-scope-store-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: API and store `+$ poke` lines are declarations, not molds; no name may shadow one already in scope.
2+tests: The partial checker reports uncertain API/store scope as unsupported, while definite duplicate declarations and unrelated prelude shadowing remain errors. A library mold cannot shadow the prelude poke type.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-scope-store-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the prepared prelude.
tests/golden/types-scope-store-shadow/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/stores/cart.jibb
tests/golden/types-scope-store-shadow/source.jibbnew file+3
@@ -0,0 +1,3 @@
1++$ poke @t
2+++ same "bad"
3+++ main (store init update)
tests/golden/types-scope-store-shadow/tokens.txtnew file+16
@@ -0,0 +1,16 @@
1+1:1 glyph +$
2+1:4 name poke
3+1:9 aura @t
4+2:1 NEWLINE
5+2:1 glyph ++
6+2:4 name same
7+2:9 str "bad"
8+3:1 NEWLINE
9+3:1 glyph ++
10+3:4 name main
11+3:9 glyph (
12+3:10 tight name store
13+3:16 name init
14+3:21 name update
15+3:27 tight glyph )
16+3:28 NEWLINE
tests/golden/types-scope-store-shadow/tree.txtnew file+6
@@ -0,0 +1,6 @@
1+(module
2+ (mold 1:1 poke (aura 1:9 @t))
3+ (value 2:1 same (str 2:9 "bad"))
4+ (value 3:1 main
5+ (group 3:9
6+ (call 3:10 (wing 3:10 store) (wing 3:16 init) (wing 3:21 update)))))
tests/golden/types-scope-store-shadow/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module has conflicting names
tests/lib/jibb-module-scope.hoon+3−2
@@ -2,6 +2,7 @@
2/+ jibb
2/+ jibb
3/* expected %txt /tests/type-module-scope/expected/txt
3/* expected %txt /tests/type-module-scope/expected/txt
4/* real-prelude %jibb /lib/jibb/prelude/jibb
4/* real-prelude %jibb /lib/jibb/prelude/jibb
5+/* real-internal %jibb /lib/jibb/internal/jibb
5/* real-source %jibb /tests/golden/types-prelude-interface/source/jibb
6/* real-source %jibb /tests/golden/types-prelude-interface/source/jibb
6/* real-left %jibb /tests/golden/types-prelude-interface/modules/ui/left/jibb
7/* real-left %jibb /tests/golden/types-prelude-interface/modules/ui/left/jibb
7/* real-right %jibb /tests/golden/types-prelude-interface/modules/ui/right/jibb
8/* real-right %jibb /tests/golden/types-prelude-interface/modules/ui/right/jibb
@@ -44,9 +45,9 @@
44 ^- @t
45 ^- @t
45 =/ fixtures=(list [at=path source=@t])
46 =/ fixtures=(list [at=path source=@t])
46 ~[[~[%ui %left %jibb] real-left] [~[%ui %right %jibb] real-right]]
47 ~[[~[%ui %left %jibb] real-left] [~[%ui %right %jibb] real-right]]
47− =/ prepared (prepare-prelude:jibb real-prelude)
48+ =/ prepared (prepare-prelude-with-internal:jibb real-prelude real-internal)
48 ?~ prepared 'real prelude preparation failed'
49 ?~ prepared 'real prelude preparation failed'
49− =/ wrapper (golden-types-with-prelude:jibb /tests/golden/types-prelude-interface/source/jibb real-source ~ ~ fixtures real-prelude)
50+ =/ wrapper (golden-types-with-prelude-and-internal:jibb /tests/golden/types-prelude-interface/source/jibb real-source ~ ~ fixtures real-prelude real-internal)
50 =/ actual (golden-types-with-prepared-prelude:jibb /tests/golden/types-prelude-interface/source/jibb real-source ~ ~ fixtures prepared)
51 =/ actual (golden-types-with-prepared-prelude:jibb /tests/golden/types-prelude-interface/source/jibb real-source ~ ~ fixtures prepared)
51 ?. =(wrapper actual) 'real prelude prepared/wrapper mismatch'
52 ?. =(wrapper actual) 'real prelude prepared/wrapper mismatch'
52 ?. =((to-wain:format (cat 3 actual '\0a')) real-expected) 'real prelude output differs from golden'
53 ?. =((to-wain:format (cat 3 actual '\0a')) real-expected) 'real prelude output differs from golden'
tests/lib/jibb-poke-bridge.hoonnew file+88
@@ -0,0 +1,88 @@
1+:: Source-backed private poke and poke-only API boundary under eval and ship.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* mark %txt /tests/type-poke/mark/txt
6+/* api %txt /tests/type-poke/api/txt
7+/* client %txt /tests/type-poke/client/txt
8+/* direct %txt /tests/type-poke/direct/txt
9+/* alias %txt /tests/type-poke/alias/txt
10+/* public %txt /tests/type-poke/public/txt
11+/* fake %txt /tests/type-poke/fake/txt
12+/* exported %txt /tests/type-poke/exported/txt
13+/* transitive %txt /tests/type-poke/transitive/txt
14+/* inner %txt /tests/type-poke/inner/txt
15+/* impostor-client %txt /tests/type-poke/impostor-client/txt
16+/* impostor %txt /tests/type-poke/impostor/txt
17+/* expected %txt /tests/type-poke/expected/txt
18+|%
19+++ text
20+ |= lines=wain
21+ ^- @t
22+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
23+++ test-poke-bridge
24+ ^- tang
25+ ?~ mark ~[leaf+"poke bridge mark fixture is missing"]
26+ ?~ api ~[leaf+"poke bridge API fixture is missing"]
27+ ?~ client ~[leaf+"poke bridge client fixture is missing"]
28+ ?~ direct ~[leaf+"poke bridge direct import fixture is missing"]
29+ ?~ alias ~[leaf+"poke bridge alias fixture is missing"]
30+ ?~ public ~[leaf+"poke bridge public fixture is missing"]
31+ ?~ fake ~[leaf+"poke bridge fake fixture is missing"]
32+ ?~ exported ~[leaf+"poke bridge export fixture is missing"]
33+ ?~ transitive ~[leaf+"poke bridge transitive fixture is missing"]
34+ ?~ inner ~[leaf+"poke bridge inner fixture is missing"]
35+ ?~ impostor-client ~[leaf+"poke bridge impostor client is missing"]
36+ ?~ impostor ~[leaf+"poke bridge impostor fixture is missing"]
37+ ?~ expected ~[leaf+"poke bridge expected output is missing"]
38+ =/ got (bridge-output prelude internal (text mark) (text api) (text client) (text direct) (text alias) (text public) (text fake) (text exported) (text transitive) (text inner) (text impostor-client) (text impostor))
39+ ?. =((to-wain:format (cat 3 got '\0a')) expected)
40+ ~[leaf+"poke bridge output differs from tests/type-poke/expected.txt"]
41+ ~
42+++ preparation-controls
43+ |= [prelude=@t internal=@t]
44+ ^- @t
45+ =/ alternate=@t (crip "+$ poke\0a [%pet name=@t]\0a %empty\0a")
46+ =/ tiny-prelude=@t (crip "/= internal /lib/jibb/internal\0a+$ poke poke.internal\0a")
47+ =/ source=@t (crip "++ zero ^- poke %empty\0a++ pet ^- poke [%pet \"cat\"]\0a++ look |= x=poke\0a ?- x\0a [%pet name] name\0a %empty \"\"\0a")
48+ =/ no-source=? ?=(~ (prepare-prelude:jibb prelude))
49+ =/ malformed=? ?=(~ (prepare-prelude-with-internal:jibb prelude (crip "+$ poke\0a")))
50+ =/ empty=? ?=(~ (prepare-prelude-with-internal:jibb prelude ''))
51+ =/ report (golden-types-with-prelude-and-internal:jibb /ui/test/jibb source ~ ~ ~ tiny-prelude alternate)
52+ (of-wain:format ~[(crip "source-less={?:(no-source "rejected" "BAD")} malformed={?:(malformed "rejected" "BAD")} empty={?:(empty "rejected" "BAD")}") report])
53+::
54+++ bridge-output
55+ |= [prelude=@t internal=@t mark=@t api=@t client=@t direct=@t alias=@t public=@t fake=@t exported=@t transitive=@t inner=@t impostor-client=@t impostor=@t]
56+ ^- @t
57+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
58+ ?~ prepared 'source-backed prelude preparation failed'
59+ =/ cor=type -:(ride -:!>(..zuse) mark)
60+ =/ mark-result=* (read-mark:jibb-import %todo-action cor)
61+ =/ marks=(list [mark=term result=*]) ~[[%todo-action mark-result]]
62+ =/ modules=(list [at=path source=@t])
63+ ~[[/ui/api/todo/jibb api] [/lib/jibb/internal/jibb internal] [/ui/internal/jibb fake] [/ui/public/jibb public] [/ui/inner/jibb inner]]
64+ =/ a (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks modules prepared)
65+ =/ b (golden-types-with-prepared-prelude:jibb /ui/test/jibb direct ~ marks modules prepared)
66+ =/ c (golden-types-with-prepared-prelude:jibb /ui/test/jibb alias ~ marks modules prepared)
67+ =/ d (golden-types-with-prepared-prelude:jibb /ui/test/jibb exported ~ marks modules prepared)
68+ =/ e (golden-types-with-prepared-prelude:jibb /ui/test/jibb transitive ~ marks modules prepared)
69+ =/ missing-marks=(list [mark=term result=*]) ~
70+ =/ duplicate-marks=(list [mark=term result=*]) ~[[%todo-action mark-result] [%todo-action mark-result]]
71+ =/ f (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ missing-marks modules prepared)
72+ =/ g (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ duplicate-marks modules prepared)
73+ =/ extra-api=@t (crip "/% %todo-action\0a+$ poke todo-action\0a+$ paths\0a [%state /state @t]\0a")
74+ =/ extra-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb extra-api]]
75+ =/ h (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks extra-modules prepared)
76+ =/ spoof-modules=(list [at=path source=@t]) ~[[/lib/jibb/internal/jibb impostor]]
77+ =/ i (golden-types-with-prepared-prelude:jibb /ui/test/jibb impostor-client ~ ~ spoof-modules prepared)
78+ =/ no-declaration=@t (crip "+$ poke todo-action\0a")
79+ =/ no-declaration-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb no-declaration]]
80+ =/ j (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks no-declaration-modules prepared)
81+ =/ collision=@t (crip "/% %todo-action\0a+$ poke todo-action\0a++ todo-action \"bad\"\0a")
82+ =/ collision-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb collision]]
83+ =/ k (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks collision-modules prepared)
84+ =/ wrong-path-source=@t (crip "/= todo /ui/wrong/todo\0a++ test (todo-action.todo \"ok\")\0a")
85+ =/ wrong-path-modules=(list [at=path source=@t]) ~[[/ui/wrong/todo/jibb api]]
86+ =/ l (golden-types-with-prepared-prelude:jibb /ui/test/jibb wrong-path-source ~ marks wrong-path-modules prepared)
87+ (of-wain:format ~[(preparation-controls prelude internal) a b c d e f g h i j k l])
88+--
tests/lib/jibb.hoon+227−202
@@ -21,6 +21,7 @@
21::
21::
22/+ jibb, jibb-import
22/+ jibb, jibb-import
23/* prelude-source %jibb /lib/jibb/prelude/jibb
23/* prelude-source %jibb /lib/jibb/prelude/jibb
24+/* internal-source %jibb /lib/jibb/internal/jibb
24/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
25/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
25/* tok-1 %txt /tests/golden/doc-core-02-update/tokens/txt
26/* tok-1 %txt /tests/golden/doc-core-02-update/tokens/txt
26/* tre-1 %txt /tests/golden/doc-core-02-update/tree/txt
27/* tre-1 %txt /tests/golden/doc-core-02-update/tree/txt
@@ -1812,170 +1813,186 @@
1812/* tok-513 %txt /tests/golden/types-recursive-sample/tokens/txt
1813/* tok-513 %txt /tests/golden/types-recursive-sample/tokens/txt
1813/* tre-513 %txt /tests/golden/types-recursive-sample/tree/txt
1814/* tre-513 %txt /tests/golden/types-recursive-sample/tree/txt
1814/* typ-513 %txt /tests/golden/types-recursive-sample/types/txt
1815/* typ-513 %txt /tests/golden/types-recursive-sample/types/txt
1816+/* src-514 %jibb /tests/golden/types-scope-library-poke/source/jibb
1817+/* tok-514 %txt /tests/golden/types-scope-library-poke/tokens/txt
1818+/* tre-514 %txt /tests/golden/types-scope-library-poke/tree/txt
1819+/* typ-514 %txt /tests/golden/types-scope-library-poke/types/txt
1820+/* src-515 %jibb /tests/golden/types-scope-root-api/source/jibb
1821+/* tok-515 %txt /tests/golden/types-scope-root-api/tokens/txt
1822+/* tre-515 %txt /tests/golden/types-scope-root-api/tree/txt
1823+/* typ-515 %txt /tests/golden/types-scope-root-api/types/txt
1824+/* src-516 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
1825+/* tok-516 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
1826+/* tre-516 %txt /tests/golden/types-scope-store-duplicate/tree/txt
1827+/* typ-516 %txt /tests/golden/types-scope-store-duplicate/types/txt
1828+/* src-517 %jibb /tests/golden/types-scope-store-shadow/source/jibb
1829+/* tok-517 %txt /tests/golden/types-scope-store-shadow/tokens/txt
1830+/* tre-517 %txt /tests/golden/types-scope-store-shadow/tree/txt
1831+/* typ-517 %txt /tests/golden/types-scope-store-shadow/types/txt
1815−/* src-514 %jibb /tests/golden/types-string-interpolation/source/jibb
1832+/* src-518 %jibb /tests/golden/types-string-interpolation/source/jibb
1816−/* tok-514 %txt /tests/golden/types-string-interpolation/tokens/txt
1833+/* tok-518 %txt /tests/golden/types-string-interpolation/tokens/txt
1817−/* tre-514 %txt /tests/golden/types-string-interpolation/tree/txt
1834+/* tre-518 %txt /tests/golden/types-string-interpolation/tree/txt
1818−/* typ-514 %txt /tests/golden/types-string-interpolation/types/txt
1835+/* typ-518 %txt /tests/golden/types-string-interpolation/types/txt
1819−/* src-515 %jibb /tests/golden/types-tuple-context/source/jibb
1836+/* src-519 %jibb /tests/golden/types-tuple-context/source/jibb
1820−/* tok-515 %txt /tests/golden/types-tuple-context/tokens/txt
1837+/* tok-519 %txt /tests/golden/types-tuple-context/tokens/txt
1821−/* tre-515 %txt /tests/golden/types-tuple-context/tree/txt
1838+/* tre-519 %txt /tests/golden/types-tuple-context/tree/txt
1822−/* typ-515 %txt /tests/golden/types-tuple-context/types/txt
1839+/* typ-519 %txt /tests/golden/types-tuple-context/types/txt
1823−/* src-516 %jibb /tests/golden/types-tuple-context-nested/source/jibb
1840+/* src-520 %jibb /tests/golden/types-tuple-context-nested/source/jibb
1824−/* tok-516 %txt /tests/golden/types-tuple-context-nested/tokens/txt
1841+/* tok-520 %txt /tests/golden/types-tuple-context-nested/tokens/txt
1825−/* tre-516 %txt /tests/golden/types-tuple-context-nested/tree/txt
1842+/* tre-520 %txt /tests/golden/types-tuple-context-nested/tree/txt
1826−/* typ-516 %txt /tests/golden/types-tuple-context-nested/types/txt
1843+/* typ-520 %txt /tests/golden/types-tuple-context-nested/types/txt
1827−/* src-517 %jibb /tests/golden/types-union-alias/source/jibb
1844+/* src-521 %jibb /tests/golden/types-union-alias/source/jibb
1828−/* tok-517 %txt /tests/golden/types-union-alias/tokens/txt
1845+/* tok-521 %txt /tests/golden/types-union-alias/tokens/txt
1829−/* tre-517 %txt /tests/golden/types-union-alias/tree/txt
1846+/* tre-521 %txt /tests/golden/types-union-alias/tree/txt
1830−/* typ-517 %txt /tests/golden/types-union-alias/types/txt
1847+/* typ-521 %txt /tests/golden/types-union-alias/types/txt
1831−/* src-518 %jibb /tests/golden/types-union-branch-context/source/jibb
1848+/* src-522 %jibb /tests/golden/types-union-branch-context/source/jibb
1832−/* tok-518 %txt /tests/golden/types-union-branch-context/tokens/txt
1849+/* tok-522 %txt /tests/golden/types-union-branch-context/tokens/txt
1833−/* tre-518 %txt /tests/golden/types-union-branch-context/tree/txt
1850+/* tre-522 %txt /tests/golden/types-union-branch-context/tree/txt
1834−/* typ-518 %txt /tests/golden/types-union-branch-context/types/txt
1851+/* typ-522 %txt /tests/golden/types-union-branch-context/types/txt
1835−/* src-519 %jibb /tests/golden/types-union-branch-pending/source/jibb
1852+/* src-523 %jibb /tests/golden/types-union-branch-pending/source/jibb
1836−/* tok-519 %txt /tests/golden/types-union-branch-pending/tokens/txt
1853+/* tok-523 %txt /tests/golden/types-union-branch-pending/tokens/txt
1837−/* tre-519 %txt /tests/golden/types-union-branch-pending/tree/txt
1854+/* tre-523 %txt /tests/golden/types-union-branch-pending/tree/txt
1838−/* typ-519 %txt /tests/golden/types-union-branch-pending/types/txt
1855+/* typ-523 %txt /tests/golden/types-union-branch-pending/types/txt
1839−/* src-520 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1856+/* src-524 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1840−/* tok-520 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1857+/* tok-524 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1841−/* tre-520 %txt /tests/golden/types-union-constructor-shape/tree/txt
1858+/* tre-524 %txt /tests/golden/types-union-constructor-shape/tree/txt
1842−/* typ-520 %txt /tests/golden/types-union-constructor-shape/types/txt
1859+/* typ-524 %txt /tests/golden/types-union-constructor-shape/types/txt
1843−/* src-521 %jibb /tests/golden/types-union-context-flow/source/jibb
1860+/* src-525 %jibb /tests/golden/types-union-context-flow/source/jibb
1844−/* tok-521 %txt /tests/golden/types-union-context-flow/tokens/txt
1861+/* tok-525 %txt /tests/golden/types-union-context-flow/tokens/txt
1845−/* tre-521 %txt /tests/golden/types-union-context-flow/tree/txt
1862+/* tre-525 %txt /tests/golden/types-union-context-flow/tree/txt
1846−/* typ-521 %txt /tests/golden/types-union-context-flow/types/txt
1863+/* typ-525 %txt /tests/golden/types-union-context-flow/types/txt
1847−/* src-522 %jibb /tests/golden/types-union-finite/source/jibb
1864+/* src-526 %jibb /tests/golden/types-union-finite/source/jibb
1848−/* tok-522 %txt /tests/golden/types-union-finite/tokens/txt
1865+/* tok-526 %txt /tests/golden/types-union-finite/tokens/txt
1849−/* tre-522 %txt /tests/golden/types-union-finite/tree/txt
1866+/* tre-526 %txt /tests/golden/types-union-finite/tree/txt
1850−/* typ-522 %txt /tests/golden/types-union-finite/types/txt
1867+/* typ-526 %txt /tests/golden/types-union-finite/types/txt
1851−/* src-523 %jibb /tests/golden/types-union-finite-context/source/jibb
1868+/* src-527 %jibb /tests/golden/types-union-finite-context/source/jibb
1852−/* tok-523 %txt /tests/golden/types-union-finite-context/tokens/txt
1869+/* tok-527 %txt /tests/golden/types-union-finite-context/tokens/txt
1853−/* tre-523 %txt /tests/golden/types-union-finite-context/tree/txt
1870+/* tre-527 %txt /tests/golden/types-union-finite-context/tree/txt
1854−/* typ-523 %txt /tests/golden/types-union-finite-context/types/txt
1871+/* typ-527 %txt /tests/golden/types-union-finite-context/types/txt
1855−/* src-524 %jibb /tests/golden/types-union-finite-generic/source/jibb
1872+/* src-528 %jibb /tests/golden/types-union-finite-generic/source/jibb
1856−/* tok-524 %txt /tests/golden/types-union-finite-generic/tokens/txt
1873+/* tok-528 %txt /tests/golden/types-union-finite-generic/tokens/txt
1857−/* tre-524 %txt /tests/golden/types-union-finite-generic/tree/txt
1874+/* tre-528 %txt /tests/golden/types-union-finite-generic/tree/txt
1858−/* typ-524 %txt /tests/golden/types-union-finite-generic/types/txt
1875+/* typ-528 %txt /tests/golden/types-union-finite-generic/types/txt
1859−/* src-525 %jibb /tests/golden/types-union-finite-limit/source/jibb
1876+/* src-529 %jibb /tests/golden/types-union-finite-limit/source/jibb
1860−/* tok-525 %txt /tests/golden/types-union-finite-limit/tokens/txt
1877+/* tok-529 %txt /tests/golden/types-union-finite-limit/tokens/txt
1861−/* tre-525 %txt /tests/golden/types-union-finite-limit/tree/txt
1878+/* tre-529 %txt /tests/golden/types-union-finite-limit/tree/txt
1862−/* typ-525 %txt /tests/golden/types-union-finite-limit/types/txt
1879+/* typ-529 %txt /tests/golden/types-union-finite-limit/types/txt
1863−/* src-526 %jibb /tests/golden/types-union-import/source/jibb
1880+/* src-530 %jibb /tests/golden/types-union-import/source/jibb
1864−/* tok-526 %txt /tests/golden/types-union-import/tokens/txt
1881+/* tok-530 %txt /tests/golden/types-union-import/tokens/txt
1865−/* tre-526 %txt /tests/golden/types-union-import/tree/txt
1882+/* tre-530 %txt /tests/golden/types-union-import/tree/txt
1866−/* mod-526-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1883+/* mod-530-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1867−/* typ-526 %txt /tests/golden/types-union-import/types/txt
1884+/* typ-530 %txt /tests/golden/types-union-import/types/txt
1868−/* mtre-526 %txt /tests/golden/types-union-import/module-trees/txt
1885+/* mtre-530 %txt /tests/golden/types-union-import/module-trees/txt
1869−/* src-527 %jibb /tests/golden/types-union-local-pending/source/jibb
1886+/* src-531 %jibb /tests/golden/types-union-local-pending/source/jibb
1870−/* tok-527 %txt /tests/golden/types-union-local-pending/tokens/txt
1887+/* tok-531 %txt /tests/golden/types-union-local-pending/tokens/txt
1871−/* tre-527 %txt /tests/golden/types-union-local-pending/tree/txt
1888+/* tre-531 %txt /tests/golden/types-union-local-pending/tree/txt
1872−/* typ-527 %txt /tests/golden/types-union-local-pending/types/txt
1889+/* typ-531 %txt /tests/golden/types-union-local-pending/types/txt
1873−/* src-528 %jibb /tests/golden/types-union-overlap/source/jibb
1890+/* src-532 %jibb /tests/golden/types-union-overlap/source/jibb
1874−/* tok-528 %txt /tests/golden/types-union-overlap/tokens/txt
1891+/* tok-532 %txt /tests/golden/types-union-overlap/tokens/txt
1875−/* tre-528 %txt /tests/golden/types-union-overlap/tree/txt
1892+/* tre-532 %txt /tests/golden/types-union-overlap/tree/txt
1876−/* typ-528 %txt /tests/golden/types-union-overlap/types/txt
1893+/* typ-532 %txt /tests/golden/types-union-overlap/types/txt
1877−/* src-529 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1894+/* src-533 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1878−/* tok-529 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1895+/* tok-533 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1879−/* tre-529 %txt /tests/golden/types-union-overlap-nested/tree/txt
1896+/* tre-533 %txt /tests/golden/types-union-overlap-nested/tree/txt
1880−/* typ-529 %txt /tests/golden/types-union-overlap-nested/types/txt
1897+/* typ-533 %txt /tests/golden/types-union-overlap-nested/types/txt
1881−/* src-530 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
1898+/* src-534 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
1882−/* tok-530 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
1899+/* tok-534 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
1883−/* tre-530 %txt /tests/golden/types-union-pattern-result-context/tree/txt
1900+/* tre-534 %txt /tests/golden/types-union-pattern-result-context/tree/txt
1884−/* typ-530 %txt /tests/golden/types-union-pattern-result-context/types/txt
1901+/* typ-534 %txt /tests/golden/types-union-pattern-result-context/types/txt
1885−/* src-531 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
1902+/* src-535 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
1886−/* tok-531 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
1903+/* tok-535 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
1887−/* tre-531 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
1904+/* tre-535 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
1888−/* typ-531 %txt /tests/golden/types-union-pattern-result-controls/types/txt
1905+/* typ-535 %txt /tests/golden/types-union-pattern-result-controls/types/txt
1889−/* src-532 %jibb /tests/golden/types-union-patterns/source/jibb
1906+/* src-536 %jibb /tests/golden/types-union-patterns/source/jibb
1890−/* tok-532 %txt /tests/golden/types-union-patterns/tokens/txt
1907+/* tok-536 %txt /tests/golden/types-union-patterns/tokens/txt
1891−/* tre-532 %txt /tests/golden/types-union-patterns/tree/txt
1908+/* tre-536 %txt /tests/golden/types-union-patterns/tree/txt
1892−/* typ-532 %txt /tests/golden/types-union-patterns/types/txt
1909+/* typ-536 %txt /tests/golden/types-union-patterns/types/txt
1893−/* src-533 %jibb /tests/golden/types-union-patterns-generic/source/jibb
1910+/* src-537 %jibb /tests/golden/types-union-patterns-generic/source/jibb
1894−/* tok-533 %txt /tests/golden/types-union-patterns-generic/tokens/txt
1911+/* tok-537 %txt /tests/golden/types-union-patterns-generic/tokens/txt
1895−/* tre-533 %txt /tests/golden/types-union-patterns-generic/tree/txt
1912+/* tre-537 %txt /tests/golden/types-union-patterns-generic/tree/txt
1896−/* typ-533 %txt /tests/golden/types-union-patterns-generic/types/txt
1913+/* typ-537 %txt /tests/golden/types-union-patterns-generic/types/txt
1897−/* src-534 %jibb /tests/golden/types-union-patterns-import/source/jibb
1914+/* src-538 %jibb /tests/golden/types-union-patterns-import/source/jibb
1898−/* tok-534 %txt /tests/golden/types-union-patterns-import/tokens/txt
1915+/* tok-538 %txt /tests/golden/types-union-patterns-import/tokens/txt
1899−/* tre-534 %txt /tests/golden/types-union-patterns-import/tree/txt
1916+/* tre-538 %txt /tests/golden/types-union-patterns-import/tree/txt
1900−/* mod-534-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
1917+/* mod-538-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
1901−/* typ-534 %txt /tests/golden/types-union-patterns-import/types/txt
1918+/* typ-538 %txt /tests/golden/types-union-patterns-import/types/txt
1902−/* mtre-534 %txt /tests/golden/types-union-patterns-import/module-trees/txt
1919+/* mtre-538 %txt /tests/golden/types-union-patterns-import/module-trees/txt
1903−/* src-535 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1920+/* src-539 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1904−/* tok-535 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1921+/* tok-539 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1905−/* tre-535 %txt /tests/golden/types-union-phantom-generic/tree/txt
1922+/* tre-539 %txt /tests/golden/types-union-phantom-generic/tree/txt
1906−/* typ-535 %txt /tests/golden/types-union-phantom-generic/types/txt
1923+/* typ-539 %txt /tests/golden/types-union-phantom-generic/types/txt
1907−/* src-536 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1924+/* src-540 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1908−/* tok-536 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1925+/* tok-540 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1909−/* tre-536 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1926+/* tre-540 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1910−/* mod-536-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1927+/* mod-540-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1911−/* typ-536 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1928+/* typ-540 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1912−/* mtre-536 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1929+/* mtre-540 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1913−/* src-537 %jibb /tests/golden/types-union-print-distinct/source/jibb
1930+/* src-541 %jibb /tests/golden/types-union-print-distinct/source/jibb
1914−/* tok-537 %txt /tests/golden/types-union-print-distinct/tokens/txt
1931+/* tok-541 %txt /tests/golden/types-union-print-distinct/tokens/txt
1915−/* tre-537 %txt /tests/golden/types-union-print-distinct/tree/txt
1932+/* tre-541 %txt /tests/golden/types-union-print-distinct/tree/txt
1916−/* mod-537-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1933+/* mod-541-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1917−/* mod-537-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1934+/* mod-541-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1918−/* mod-537-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1935+/* mod-541-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1919−/* typ-537 %txt /tests/golden/types-union-print-distinct/types/txt
1936+/* typ-541 %txt /tests/golden/types-union-print-distinct/types/txt
1920−/* mtre-537 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1937+/* mtre-541 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1921−/* src-538 %jibb /tests/golden/types-union-print-escape/source/jibb
1938+/* src-542 %jibb /tests/golden/types-union-print-escape/source/jibb
1922−/* tok-538 %txt /tests/golden/types-union-print-escape/tokens/txt
1939+/* tok-542 %txt /tests/golden/types-union-print-escape/tokens/txt
1923−/* tre-538 %txt /tests/golden/types-union-print-escape/tree/txt
1940+/* tre-542 %txt /tests/golden/types-union-print-escape/tree/txt
1924−/* typ-538 %txt /tests/golden/types-union-print-escape/types/txt
1941+/* typ-542 %txt /tests/golden/types-union-print-escape/types/txt
1925−/* src-539 %jibb /tests/golden/types-union-print-local/source/jibb
1942+/* src-543 %jibb /tests/golden/types-union-print-local/source/jibb
1926−/* tok-539 %txt /tests/golden/types-union-print-local/tokens/txt
1943+/* tok-543 %txt /tests/golden/types-union-print-local/tokens/txt
1927−/* tre-539 %txt /tests/golden/types-union-print-local/tree/txt
1944+/* tre-543 %txt /tests/golden/types-union-print-local/tree/txt
1928−/* typ-539 %txt /tests/golden/types-union-print-local/types/txt
1945+/* typ-543 %txt /tests/golden/types-union-print-local/types/txt
1929−/* src-540 %jibb /tests/golden/types-union-print-nested/source/jibb
1946+/* src-544 %jibb /tests/golden/types-union-print-nested/source/jibb
1930−/* tok-540 %txt /tests/golden/types-union-print-nested/tokens/txt
1947+/* tok-544 %txt /tests/golden/types-union-print-nested/tokens/txt
1931−/* tre-540 %txt /tests/golden/types-union-print-nested/tree/txt
1948+/* tre-544 %txt /tests/golden/types-union-print-nested/tree/txt
1932−/* typ-540 %txt /tests/golden/types-union-print-nested/types/txt
1949+/* typ-544 %txt /tests/golden/types-union-print-nested/types/txt
1933−/* src-541 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1950+/* src-545 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1934−/* tok-541 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1951+/* tok-545 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1935−/* tre-541 %txt /tests/golden/types-union-print-same-origin/tree/txt
1952+/* tre-545 %txt /tests/golden/types-union-print-same-origin/tree/txt
1936−/* mod-541-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1953+/* mod-545-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1937−/* typ-541 %txt /tests/golden/types-union-print-same-origin/types/txt
1954+/* typ-545 %txt /tests/golden/types-union-print-same-origin/types/txt
1938−/* mtre-541 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1955+/* mtre-545 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1939−/* src-542 %jibb /tests/golden/types-union-print-transitive/source/jibb
1956+/* src-546 %jibb /tests/golden/types-union-print-transitive/source/jibb
1940−/* tok-542 %txt /tests/golden/types-union-print-transitive/tokens/txt
1957+/* tok-546 %txt /tests/golden/types-union-print-transitive/tokens/txt
1941−/* tre-542 %txt /tests/golden/types-union-print-transitive/tree/txt
1958+/* tre-546 %txt /tests/golden/types-union-print-transitive/tree/txt
1942−/* mod-542-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1959+/* mod-546-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1943−/* mod-542-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1960+/* mod-546-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1944−/* typ-542 %txt /tests/golden/types-union-print-transitive/types/txt
1961+/* typ-546 %txt /tests/golden/types-union-print-transitive/types/txt
1945−/* mtre-542 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1962+/* mtre-546 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1946−/* src-543 %jibb /tests/golden/types-union-singleton/source/jibb
1963+/* src-547 %jibb /tests/golden/types-union-singleton/source/jibb
1947−/* tok-543 %txt /tests/golden/types-union-singleton/tokens/txt
1964+/* tok-547 %txt /tests/golden/types-union-singleton/tokens/txt
1948−/* tre-543 %txt /tests/golden/types-union-singleton/tree/txt
1965+/* tre-547 %txt /tests/golden/types-union-singleton/tree/txt
1949−/* typ-543 %txt /tests/golden/types-union-singleton/types/txt
1966+/* typ-547 %txt /tests/golden/types-union-singleton/types/txt
1950−/* src-544 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1967+/* src-548 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1951−/* tok-544 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1968+/* tok-548 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1952−/* tre-544 %txt /tests/golden/types-union-tag-atoms/tree/txt
1969+/* tre-548 %txt /tests/golden/types-union-tag-atoms/tree/txt
1953−/* typ-544 %txt /tests/golden/types-union-tag-atoms/types/txt
1970+/* typ-548 %txt /tests/golden/types-union-tag-atoms/types/txt
1954−/* src-545 %jibb /tests/golden/types-union-tags/source/jibb
1971+/* src-549 %jibb /tests/golden/types-union-tags/source/jibb
1955−/* tok-545 %txt /tests/golden/types-union-tags/tokens/txt
1972+/* tok-549 %txt /tests/golden/types-union-tags/tokens/txt
1956−/* tre-545 %txt /tests/golden/types-union-tags/tree/txt
1973+/* tre-549 %txt /tests/golden/types-union-tags/tree/txt
1957−/* typ-545 %txt /tests/golden/types-union-tags/types/txt
1974+/* typ-549 %txt /tests/golden/types-union-tags/types/txt
1958−/* src-546 %jibb /tests/golden/types-union-unresolved/source/jibb
1975+/* src-550 %jibb /tests/golden/types-union-unresolved/source/jibb
1959−/* tok-546 %txt /tests/golden/types-union-unresolved/tokens/txt
1976+/* tok-550 %txt /tests/golden/types-union-unresolved/tokens/txt
1960−/* tre-546 %txt /tests/golden/types-union-unresolved/tree/txt
1977+/* tre-550 %txt /tests/golden/types-union-unresolved/tree/txt
1961−/* typ-546 %txt /tests/golden/types-union-unresolved/types/txt
1978+/* typ-550 %txt /tests/golden/types-union-unresolved/types/txt
1962−/* src-547 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1979+/* src-551 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1963−/* tok-547 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1980+/* tok-551 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1964−/* tre-547 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1981+/* tre-551 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1965−/* typ-547 %txt /tests/golden/types-union-unresolved-flow/types/txt
1982+/* typ-551 %txt /tests/golden/types-union-unresolved-flow/types/txt
1966−/* src-548 %jibb /tests/golden/types-unit-construction/source/jibb
1983+/* src-552 %jibb /tests/golden/types-unit-construction/source/jibb
1967−/* tok-548 %txt /tests/golden/types-unit-construction/tokens/txt
1984+/* tok-552 %txt /tests/golden/types-unit-construction/tokens/txt
1968−/* tre-548 %txt /tests/golden/types-unit-construction/tree/txt
1985+/* tre-552 %txt /tests/golden/types-unit-construction/tree/txt
1969−/* typ-548 %txt /tests/golden/types-unit-construction/types/txt
1986+/* typ-552 %txt /tests/golden/types-unit-construction/types/txt
1970−/* src-549 %jibb /tests/golden/types-unit-context/source/jibb
1987+/* src-553 %jibb /tests/golden/types-unit-context/source/jibb
1971−/* tok-549 %txt /tests/golden/types-unit-context/tokens/txt
1988+/* tok-553 %txt /tests/golden/types-unit-context/tokens/txt
1972−/* tre-549 %txt /tests/golden/types-unit-context/tree/txt
1989+/* tre-553 %txt /tests/golden/types-unit-context/tree/txt
1973−/* typ-549 %txt /tests/golden/types-unit-context/types/txt
1990+/* typ-553 %txt /tests/golden/types-unit-context/types/txt
1974−/* src-550 %jibb /tests/golden/types-unit-patterns/source/jibb
1991+/* src-554 %jibb /tests/golden/types-unit-patterns/source/jibb
1975−/* tok-550 %txt /tests/golden/types-unit-patterns/tokens/txt
1992+/* tok-554 %txt /tests/golden/types-unit-patterns/tokens/txt
1976−/* tre-550 %txt /tests/golden/types-unit-patterns/tree/txt
1993+/* tre-554 %txt /tests/golden/types-unit-patterns/tree/txt
1977−/* typ-550 %txt /tests/golden/types-unit-patterns/types/txt
1994+/* typ-554 %txt /tests/golden/types-unit-patterns/types/txt
1978−=/ prepared-prelude (prepare-prelude:jibb prelude-source)
1995+=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
1979|%
1996|%
1980:: one arm per case
1997:: one arm per case
1981::
1998::
@@ -3005,80 +3022,88 @@
3005 (weld (check ~.types-recursive-gate src-512 `tok-512 `tre-512) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-512 `typ-512))
3022 (weld (check ~.types-recursive-gate src-512 `tok-512 `tre-512) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-512 `typ-512))
3006++ test-types-recursive-sample
3023++ test-types-recursive-sample
3007 (weld (check ~.types-recursive-sample src-513 `tok-513 `tre-513) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-513 `typ-513))
3024 (weld (check ~.types-recursive-sample src-513 `tok-513 `tre-513) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-513 `typ-513))
3025+++ test-types-scope-library-poke
3026+ (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-514 `tok-514 `tre-514) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-514 `typ-514 ~ ~ ~))
3027+++ test-types-scope-root-api
3028+ (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-515 `tok-515 `tre-515) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-515 `typ-515 ~ ~ ~))
3029+++ test-types-scope-store-duplicate
3030+ (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-516 `tok-516 `tre-516) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-516 `typ-516 ~ ~ ~))
3031+++ test-types-scope-store-shadow
3032+ (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-517 `tok-517 `tre-517) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-517 `typ-517 ~ ~ ~))
3008++ test-types-string-interpolation
3033++ test-types-string-interpolation
3009− (weld (check ~.types-string-interpolation src-514 `tok-514 `tre-514) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-514 `typ-514 ~ ~ ~))
3034+ (weld (check ~.types-string-interpolation src-518 `tok-518 `tre-518) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-518 `typ-518 ~ ~ ~))
3010++ test-types-tuple-context
3035++ test-types-tuple-context
3011− (weld (check ~.types-tuple-context src-515 `tok-515 `tre-515) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-515 `typ-515 ~ ~ ~))
3036+ (weld (check ~.types-tuple-context src-519 `tok-519 `tre-519) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-519 `typ-519 ~ ~ ~))
3012++ test-types-tuple-context-nested
3037++ test-types-tuple-context-nested
3013− (weld (check ~.types-tuple-context-nested src-516 `tok-516 `tre-516) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-516 `typ-516 ~ ~ ~))
3038+ (weld (check ~.types-tuple-context-nested src-520 `tok-520 `tre-520) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-520 `typ-520 ~ ~ ~))
3014++ test-types-union-alias
3039++ test-types-union-alias
3015− (weld (check ~.types-union-alias src-517 `tok-517 `tre-517) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-517 `typ-517))
3040+ (weld (check ~.types-union-alias src-521 `tok-521 `tre-521) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-521 `typ-521))
3016++ test-types-union-branch-context
3041++ test-types-union-branch-context
3017− (weld (check ~.types-union-branch-context src-518 `tok-518 `tre-518) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-518 `typ-518))
3042+ (weld (check ~.types-union-branch-context src-522 `tok-522 `tre-522) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-522 `typ-522))
3018++ test-types-union-branch-pending
3043++ test-types-union-branch-pending
3019− (weld (check ~.types-union-branch-pending src-519 `tok-519 `tre-519) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-519 `typ-519))
3044+ (weld (check ~.types-union-branch-pending src-523 `tok-523 `tre-523) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-523 `typ-523))
3020++ test-types-union-constructor-shape
3045++ test-types-union-constructor-shape
3021− (weld (check ~.types-union-constructor-shape src-520 `tok-520 `tre-520) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-520 `typ-520))
3046+ (weld (check ~.types-union-constructor-shape src-524 `tok-524 `tre-524) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-524 `typ-524))
3022++ test-types-union-context-flow
3047++ test-types-union-context-flow
3023− (weld (check ~.types-union-context-flow src-521 `tok-521 `tre-521) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-521 `typ-521))
3048+ (weld (check ~.types-union-context-flow src-525 `tok-525 `tre-525) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-525 `typ-525))
3024++ test-types-union-finite
3049++ test-types-union-finite
3025− (weld (check ~.types-union-finite src-522 `tok-522 `tre-522) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-522 `typ-522 ~ ~ ~))
3050+ (weld (check ~.types-union-finite src-526 `tok-526 `tre-526) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-526 `typ-526 ~ ~ ~))
3026++ test-types-union-finite-context
3051++ test-types-union-finite-context
3027− (weld (check ~.types-union-finite-context src-523 `tok-523 `tre-523) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-523 `typ-523 ~ ~ ~))
3052+ (weld (check ~.types-union-finite-context src-527 `tok-527 `tre-527) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-527 `typ-527 ~ ~ ~))
3028++ test-types-union-finite-generic
3053++ test-types-union-finite-generic
3029− (weld (check ~.types-union-finite-generic src-524 `tok-524 `tre-524) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-524 `typ-524 ~ ~ ~))
3054+ (weld (check ~.types-union-finite-generic src-528 `tok-528 `tre-528) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-528 `typ-528 ~ ~ ~))
3030++ test-types-union-finite-limit
3055++ test-types-union-finite-limit
3031− (weld (check ~.types-union-finite-limit src-525 `tok-525 `tre-525) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-525 `typ-525 ~ ~ ~))
3056+ (weld (check ~.types-union-finite-limit src-529 `tok-529 `tre-529) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-529 `typ-529 ~ ~ ~))
3032++ test-types-union-import
3057++ test-types-union-import
3033− (weld (weld (check ~.types-union-import src-526 `tok-526 `tre-526) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-526 `typ-526 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-526-1]])) (check-module-trees ~.types-union-import `mtre-526 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-526-1]]))
3058+ (weld (weld (check ~.types-union-import src-530 `tok-530 `tre-530) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-530 `typ-530 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-530-1]])) (check-module-trees ~.types-union-import `mtre-530 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-530-1]]))
3034++ test-types-union-local-pending
3059++ test-types-union-local-pending
3035− (weld (check ~.types-union-local-pending src-527 `tok-527 `tre-527) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-527 `typ-527))
3060+ (weld (check ~.types-union-local-pending src-531 `tok-531 `tre-531) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-531 `typ-531))
3036++ test-types-union-overlap
3061++ test-types-union-overlap
3037− (weld (check ~.types-union-overlap src-528 `tok-528 `tre-528) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-528 `typ-528))
3062+ (weld (check ~.types-union-overlap src-532 `tok-532 `tre-532) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-532 `typ-532))
3038++ test-types-union-overlap-nested
3063++ test-types-union-overlap-nested
3039− (weld (check ~.types-union-overlap-nested src-529 `tok-529 `tre-529) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-529 `typ-529))
3064+ (weld (check ~.types-union-overlap-nested src-533 `tok-533 `tre-533) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-533 `typ-533))
3040++ test-types-union-pattern-result-context
3065++ test-types-union-pattern-result-context
3041− (weld (check ~.types-union-pattern-result-context src-530 `tok-530 `tre-530) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-530 `typ-530 ~ ~ ~))
3066+ (weld (check ~.types-union-pattern-result-context src-534 `tok-534 `tre-534) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-534 `typ-534 ~ ~ ~))
3042++ test-types-union-pattern-result-controls
3067++ test-types-union-pattern-result-controls
3043− (weld (check ~.types-union-pattern-result-controls src-531 `tok-531 `tre-531) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-531 `typ-531 ~ ~ ~))
3068+ (weld (check ~.types-union-pattern-result-controls src-535 `tok-535 `tre-535) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-535 `typ-535 ~ ~ ~))
3044++ test-types-union-patterns
3069++ test-types-union-patterns
3045− (weld (check ~.types-union-patterns src-532 `tok-532 `tre-532) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-532 `typ-532 ~ ~ ~))
3070+ (weld (check ~.types-union-patterns src-536 `tok-536 `tre-536) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-536 `typ-536 ~ ~ ~))
3046++ test-types-union-patterns-generic
3071++ test-types-union-patterns-generic
3047− (weld (check ~.types-union-patterns-generic src-533 `tok-533 `tre-533) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-533 `typ-533 ~ ~ ~))
3072+ (weld (check ~.types-union-patterns-generic src-537 `tok-537 `tre-537) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-537 `typ-537 ~ ~ ~))
3048++ test-types-union-patterns-import
3073++ test-types-union-patterns-import
3049− (weld (weld (check ~.types-union-patterns-import src-534 `tok-534 `tre-534) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-534 `typ-534 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-534-1]])) (check-module-trees ~.types-union-patterns-import `mtre-534 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-534-1]]))
3074+ (weld (weld (check ~.types-union-patterns-import src-538 `tok-538 `tre-538) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-538 `typ-538 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-538-1]])) (check-module-trees ~.types-union-patterns-import `mtre-538 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-538-1]]))
3050++ test-types-union-phantom-generic
3075++ test-types-union-phantom-generic
3051− (weld (check ~.types-union-phantom-generic src-535 `tok-535 `tre-535) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-535 `typ-535))
3076+ (weld (check ~.types-union-phantom-generic src-539 `tok-539 `tre-539) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-539 `typ-539))
3052++ test-types-union-print-cross-namespace
3077++ test-types-union-print-cross-namespace
3053− (weld (weld (check ~.types-union-print-cross-namespace src-536 `tok-536 `tre-536) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-536 `typ-536 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-536-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-536 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-536-1]]))
3078+ (weld (weld (check ~.types-union-print-cross-namespace src-540 `tok-540 `tre-540) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-540 `typ-540 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-540-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-540 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-540-1]]))
3054++ test-types-union-print-distinct
3079++ test-types-union-print-distinct
3055− (weld (weld (check ~.types-union-print-distinct src-537 `tok-537 `tre-537) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-537 `typ-537 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-537-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-537-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-537-3]])) (check-module-trees ~.types-union-print-distinct `mtre-537 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-537-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-537-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-537-3]]))
3080+ (weld (weld (check ~.types-union-print-distinct src-541 `tok-541 `tre-541) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-541 `typ-541 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-541-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-541-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-541-3]])) (check-module-trees ~.types-union-print-distinct `mtre-541 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-541-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-541-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-541-3]]))
3056++ test-types-union-print-escape
3081++ test-types-union-print-escape
3057− (weld (check ~.types-union-print-escape src-538 `tok-538 `tre-538) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-538 `typ-538))
3082+ (weld (check ~.types-union-print-escape src-542 `tok-542 `tre-542) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-542 `typ-542))
3058++ test-types-union-print-local
3083++ test-types-union-print-local
3059− (weld (check ~.types-union-print-local src-539 `tok-539 `tre-539) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-539 `typ-539))
3084+ (weld (check ~.types-union-print-local src-543 `tok-543 `tre-543) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-543 `typ-543))
3060++ test-types-union-print-nested
3085++ test-types-union-print-nested
3061− (weld (check ~.types-union-print-nested src-540 `tok-540 `tre-540) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-540 `typ-540))
3086+ (weld (check ~.types-union-print-nested src-544 `tok-544 `tre-544) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-544 `typ-544))
3062++ test-types-union-print-same-origin
3087++ test-types-union-print-same-origin
3063− (weld (weld (check ~.types-union-print-same-origin src-541 `tok-541 `tre-541) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-541 `typ-541 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-541-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-541 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-541-1]]))
3088+ (weld (weld (check ~.types-union-print-same-origin src-545 `tok-545 `tre-545) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-545 `typ-545 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-545-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-545 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-545-1]]))
3064++ test-types-union-print-transitive
3089++ test-types-union-print-transitive
3065− (weld (weld (check ~.types-union-print-transitive src-542 `tok-542 `tre-542) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-542 `typ-542 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-542-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-542-2]])) (check-module-trees ~.types-union-print-transitive `mtre-542 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-542-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-542-2]]))
3090+ (weld (weld (check ~.types-union-print-transitive src-546 `tok-546 `tre-546) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-546 `typ-546 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-546-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-546-2]])) (check-module-trees ~.types-union-print-transitive `mtre-546 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-546-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-546-2]]))
3066++ test-types-union-singleton
3091++ test-types-union-singleton
3067− (weld (check ~.types-union-singleton src-543 `tok-543 `tre-543) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-543 `typ-543))
3092+ (weld (check ~.types-union-singleton src-547 `tok-547 `tre-547) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-547 `typ-547))
3068++ test-types-union-tag-atoms
3093++ test-types-union-tag-atoms
3069− (weld (check ~.types-union-tag-atoms src-544 `tok-544 `tre-544) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-544 `typ-544))
3094+ (weld (check ~.types-union-tag-atoms src-548 `tok-548 `tre-548) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-548 `typ-548))
3070++ test-types-union-tags
3095++ test-types-union-tags
3071− (weld (check ~.types-union-tags src-545 `tok-545 `tre-545) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-545 `typ-545))
3096+ (weld (check ~.types-union-tags src-549 `tok-549 `tre-549) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-549 `typ-549))
3072++ test-types-union-unresolved
3097++ test-types-union-unresolved
3073− (weld (check ~.types-union-unresolved src-546 `tok-546 `tre-546) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-546 `typ-546))
3098+ (weld (check ~.types-union-unresolved src-550 `tok-550 `tre-550) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-550 `typ-550))
3074++ test-types-union-unresolved-flow
3099++ test-types-union-unresolved-flow
3075− (weld (check ~.types-union-unresolved-flow src-547 `tok-547 `tre-547) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-547 `typ-547))
3100+ (weld (check ~.types-union-unresolved-flow src-551 `tok-551 `tre-551) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-551 `typ-551))
3076++ test-types-unit-construction
3101++ test-types-unit-construction
3077− (weld (check ~.types-unit-construction src-548 `tok-548 `tre-548) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-548 `typ-548 ~ ~ ~))
3102+ (weld (check ~.types-unit-construction src-552 `tok-552 `tre-552) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-552 `typ-552 ~ ~ ~))
3078++ test-types-unit-context
3103++ test-types-unit-context
3079− (weld (check ~.types-unit-context src-549 `tok-549 `tre-549) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-549 `typ-549 ~ ~ ~))
3104+ (weld (check ~.types-unit-context src-553 `tok-553 `tre-553) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-553 `typ-553 ~ ~ ~))
3080++ test-types-unit-patterns
3105++ test-types-unit-patterns
3081− (weld (check ~.types-unit-patterns src-550 `tok-550 `tre-550) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-550 `typ-550))
3106+ (weld (check ~.types-unit-patterns src-554 `tok-554 `tre-554) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-554 `typ-554))
3082::
3107::
3083:: +check: run golden:jibb on a case and compare both outputs
3108:: +check: run golden:jibb on a case and compare both outputs
3084::
3109::
@@ -3241,6 +3266,6 @@
3241 =/ sources=(list [path=path source=@t])
3266 =/ sources=(list [path=path source=@t])
3242 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
3267 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
3243 ?~ prepared-prelude
3268 ?~ prepared-prelude
3244− (golden-types-with-prelude:jibb at src external mark-external sources prelude-source)
3269+ (golden-types-with-prelude-and-internal:jibb at src external mark-external sources prelude-source internal-source)
3245 (golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)
3270 (golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)
3246--
3271--
tests/type-import-diagnostic/about.txt+1−1
@@ -3,7 +3,7 @@ gates errors where used; unused molds are skipped. This fixture compiles a
3/sur file and a mark against zuse and passes unchanged structured reader
3/sur file and a mark against zuse and passes unchanged structured reader
4results to the partial checker. Proven errors identify the Jibb use site for direct or nested record and
4results to the partial checker. Proven errors identify the Jibb use site for direct or nested record and
5function casts, cell samples, and non-generic local aliases. Ordered replay
5function casts, cell samples, and non-generic local aliases. Ordered replay
6−stops at an unsupported prefix, cycle or shadowing failure; unions, generic
6+passes a supported noun (`*`) prefix and stops at an unsupported prefix, cycle or shadowing failure; unions, generic
7applications and transitive modules remain unsupported. Valid sibling
7applications and transitive modules remain unsupported. Valid sibling
8definitions still infer.
8definitions still infer.
9
9
tests/type-import-diagnostic/expected.txt+4−1
@@ -52,7 +52,10 @@ partial inference; module not checked
52/ui/test.jibb:2:10: invalid imported mold
52/ui/test.jibb:2:10: invalid imported mold
53+$ alias bad.foo
53+$ alias bad.foo
54 ^
54 ^
55−++ first-unsupported: cast mold is not supported by partial inference
55+++ first-unsupported: signed and float auras cannot be imported
56+/ui/test.jibb:8:32: invalid imported mold
57+++ first-unsupported ^- [a=* b=bad.foo] !!
58+ ^
56++ recursive-first: cast mold is not supported by partial inference
59++ recursive-first: cast mold is not supported by partial inference
57++ shadow: sample shadows a name
60++ shadow: sample shadows a name
58++ first-invalid: signed and float auras cannot be imported
61++ first-invalid: signed and float auras cannot be imported
tests/type-poke/about.txtnew file+7
@@ -0,0 +1,7 @@
1+The internal prelude defines poke, while the public prelude re-exports it as an
2+ordinary transparent type. A real Hoon mark is compiled and read by the importer
3+before the partial checker builds a poke-only API interface. The reports cover
4+the constructor and mark mismatch, aliases and re-exports, ordinary construction
5+and inspection, private import boundaries, unsupported or invalid API declarations,
6+and preparation failures. The report remains partial; effect lowering and runtime
7+execution are not verified.
tests/type-poke/alias.txtnew file+2
@@ -0,0 +1,2 @@
1+/= fake /ui/internal
2+++ nope |= x=poke.fake x
tests/type-poke/api.txtnew file+2
@@ -0,0 +1,2 @@
1+/% %todo-action
2++$ poke todo-action
tests/type-poke/client.txtnew file+23
@@ -0,0 +1,23 @@
1+/= todo /ui/api/todo
2++$ copy poke
3++$ double copy
4+++ good (todo-action.todo "ok")
5+++ pass |= x=poke x
6+++ pass-alias |= x=copy x
7+++ direct ^- poke [%agent %todo %todo-action "x"]
8+++ alias ^- double [%agent %todo %todo-action "x"]
9+++ getter |= x=poke payload.x
10+++ inspect |= x=poke
11+ ?- x
12+ [%agent a b c] "agent"
13+ [%store a b c] "store"
14+++ change |= x=poke x(payload="new")
15+++ cast-atom ^- poke 0
16+++ leaked |= x=copy ^- @t x
17+++ split |= x=poke
18+ ?- x
19+ [a b] a
20+++ number [(todo-action.todo "write") 1]
21+++ bad-constructor (todo-action.todo ~zod)
22+++ bad-mark ^- poke [%agent %todo 0x1f "x"]
23+++ bad-case ^- poke [%alien %todo %todo-action "x"]
tests/type-poke/direct.txtnew file+2
@@ -0,0 +1,2 @@
1+/= leak /lib/jibb/internal
2+++ nope |= x=poke.leak x
tests/type-poke/expected.txtnew file+66
@@ -0,0 +1,66 @@
1+source-less=rejected malformed=rejected empty=rejected
2+partial inference; module not checked
3+++ zero: poke
4+++ pet: poke
5+++ look: $-(poke @t)
6+partial inference; module not checked
7++$ copy: not checked
8++$ double: not checked
9+++ good: poke
10+++ pass: $-(poke poke)
11+++ pass-alias: $-(poke poke)
12+++ direct: poke
13+++ alias: poke
14+++ getter: field is not available to partial inference
15+++ inspect: $-(poke @t)
16+++ change: change target needs a known record in partial inference
17+++ cast-atom: cast constraint is not supported by partial inference
18+++ leaked: cast constraint is not supported by partial inference
19+++ split: cell pattern subject is not supported by partial inference
20+++ number: [poke @ud]
21+++ bad-constructor: call's sample and argument types do not unify
22+/ui/test.jibb:21:21: called gate
23+++ bad-constructor (todo-action.todo ~zod)
24+ ^
25+/ui/test.jibb:21:38: argument has type @p
26+++ bad-constructor (todo-action.todo ~zod)
27+ ^
28+++ bad-mark: cast mold and expression type do not unify
29+/ui/test.jibb:22:16: cast mold
30+++ bad-mark ^- poke [%agent %todo 0x1f "x"]
31+ ^
32+/ui/test.jibb:22:21: expression
33+++ bad-mark ^- poke [%agent %todo 0x1f "x"]
34+ ^
35+++ bad-case: cast mold and expression type do not unify
36+/ui/test.jibb:23:16: cast mold
37+++ bad-case ^- poke [%alien %todo %todo-action "x"]
38+ ^
39+/ui/test.jibb:23:21: expression
40+++ bad-case ^- poke [%alien %todo %todo-action "x"]
41+ ^
42+partial inference; module not checked
43+the prelude internal module is private
44+partial inference; module not checked
45+++ nope: sample mold is not supported by partial inference
46+partial inference; module not checked
47+++ pass: $-(poke poke)
48+++ fake-to-real: cast constraint is not supported by partial inference
49+++ real-to-fake: cast constraint is not supported by partial inference
50+++ match-tag: union pattern is not supported by partial inference
51+partial inference; module not checked
52+the prelude internal module is private
53+partial inference; module not checked
54+API module needs unsupported inference: /ui/api/todo/jibb
55+partial inference; module not checked
56+API module needs unsupported inference: /ui/api/todo/jibb
57+partial inference; module not checked
58+API module needs unsupported inference: /ui/api/todo/jibb
59+partial inference; module not checked
60+the prelude internal module is private
61+partial inference; module not checked
62+API module needs unsupported inference: /ui/api/todo/jibb
63+partial inference; module not checked
64+API module needs unsupported inference: /ui/api/todo/jibb
65+partial inference; module not checked
66+module has conflicting names: /ui/wrong/todo/jibb
tests/type-poke/exported.txtnew file+9
@@ -0,0 +1,9 @@
1+/= public /ui/public
2+/= fake /ui/internal
3+++ pass |= x=exposed.public ^- poke x
4+++ fake-to-real |= x=faux.fake ^- poke x
5+++ real-to-fake |= x=poke ^- faux.fake x
6+++ match-tag |= x=poke
7+ ?- x
8+ %agent "a"
9+ * "b"
tests/type-poke/fake.txtnew file+4
@@ -0,0 +1,4 @@
1++$ faux
2+ [%agent agent=@tas mark=@tas payload=@t]
3+ [%store module=@t action=@tas payload=@t]
4+++ hold |= x=faux x
tests/type-poke/impostor-client.txtnew file+2
@@ -0,0 +1,2 @@
1+/= hidden /lib/jibb/internal
2+++ leaked secret.hidden
tests/type-poke/impostor.txtnew file+1
@@ -0,0 +1 @@
1+++ secret "private"
tests/type-poke/inner.txtnew file+2
@@ -0,0 +1,2 @@
1+/= hidden /lib/jibb/internal
2++$ exported poke.hidden
tests/type-poke/mark.txtnew file+5
@@ -0,0 +1,5 @@
1+|_ a=@t
2+++ grab |% ++ noun @t --
3+++ grow |% ++ noun a --
4+++ grad %noun
5+--
tests/type-poke/public.txtnew file+2
@@ -0,0 +1,2 @@
1++$ exposed poke
2+++ carry |= x=exposed x
tests/type-poke/transitive.txtnew file+2
@@ -0,0 +1,2 @@
1+/= leaked /ui/inner
2+++ nope |= x=poke.leaked x
tools/golden+12−2
@@ -256,7 +256,7 @@ def golden_program(lib_path, cases):
256 marks = '(import-marks marks.metadata)' if imported else '~'
256 marks = '(import-marks marks.metadata)' if imported else '~'
257 modules = '(turn modules.metadata |=(item=[label=@t at=path source=@t] [at.item source.item]))'
257 modules = '(turn modules.metadata |=(item=[label=@t at=path source=@t] [at.item source.item]))'
258 types_value = ('?:(module-check.metadata ?~(prepared-prelude '
258 types_value = ('?:(module-check.metadata ?~(prepared-prelude '
259− '(golden-types-with-prelude:lib at src %s %s %s prelude-source) '
259+ '(golden-types-with-prelude-and-internal:lib at src %s %s %s prelude-source internal-source) '
260 '(golden-types-with-prepared-prelude:lib at src %s %s %s prepared-prelude)) %s)'
260 '(golden-types-with-prepared-prelude:lib at src %s %s %s prepared-prelude)) %s)'
261 % (surs, marks, modules, surs, marks, modules, types_value))
261 % (surs, marks, modules, surs, marks, modules, types_value))
262 types_expr = '?:(check.metadata %s \'\')' % types_value
262 types_expr = '?:(check.metadata %s \'\')' % types_value
@@ -268,12 +268,22 @@ def golden_program(lib_path, cases):
268 parts = ue.cord_pieces(f.read())
268 parts = ue.cord_pieces(f.read())
269 except OSError as e:
269 except OSError as e:
270 raise ue.ToolError('cannot read the Jibb prelude %s: %s' % (prelude_path, e))
270 raise ue.ToolError('cannot read the Jibb prelude %s: %s' % (prelude_path, e))
271+ internal_path = os.path.join(ue.ROOT, 'jibb-dev', 'lib', 'jibb', 'internal.jibb')
272+ try:
273+ with open(internal_path, 'rb') as f:
274+ internal_parts = ue.cord_pieces(f.read())
275+ except OSError as e:
276+ raise ue.ToolError('cannot read the internal Jibb prelude %s: %s' % (internal_path, e))
271 prelude_helper = "++ prelude-source\n ^- @t\n (rap 3 `(list @t)`~[%s])\n" % (
277 prelude_helper = "++ prelude-source\n ^- @t\n (rap 3 `(list @t)`~[%s])\n" % (
272 ' '.join(ue.cord_literal(p) for p in parts))
278 ' '.join(ue.cord_literal(p) for p in parts))
279+ prelude_helper += "++ internal-source\n ^- @t\n (rap 3 `(list @t)`~[%s])\n" % (
280+ ' '.join(ue.cord_literal(p) for p in internal_parts))
273 prelude_expr = '(rap 3 `(list @t)`~[%s])' % (
281 prelude_expr = '(rap 3 `(list @t)`~[%s])' % (
274 ' '.join(ue.cord_literal(p) for p in parts))
282 ' '.join(ue.cord_literal(p) for p in parts))
283+ internal_expr = '(rap 3 `(list @t)`~[%s])' % (
284+ ' '.join(ue.cord_literal(p) for p in internal_parts))
275 harness = harness.replace('|^ %+ rap 3',
285 harness = harness.replace('|^ %+ rap 3',
276− '=/ prepared-prelude (prepare-prelude:lib %s)\n|^ %%+ rap 3' % prelude_expr)
286+ '=/ prepared-prelude (prepare-prelude-with-internal:lib %s %s)\n|^ %%+ rap 3' % (prelude_expr, internal_expr))
277 prog.add(harness.replace('{count}', str(len(cases)))
287 prog.add(harness.replace('{count}', str(len(cases)))
278 .replace('{runs}', runs)
288 .replace('{runs}', runs)
279 .replace('{types-expr}', types_expr if any(c.want_types for c in cases) else "''")
289 .replace('{types-expr}', types_expr if any(c.want_types for c in cases) else "''")
tools/ship+3−2
@@ -1077,6 +1077,7 @@ def generate_tests(golden):
1077 '/+ jibb, jibb-import' if has_imports or has_module_types else '/+ jibb']
1077 '/+ jibb, jibb-import' if has_imports or has_module_types else '/+ jibb']
1078 if has_module_types:
1078 if has_module_types:
1079 lines.append('/* prelude-source %jibb /lib/jibb/prelude/jibb')
1079 lines.append('/* prelude-source %jibb /lib/jibb/prelude/jibb')
1080+ lines.append('/* internal-source %jibb /lib/jibb/internal/jibb')
1080 arms = []
1081 arms = []
1081 for i, ((name, folder), arm) in enumerate(
1082 for i, ((name, folder), arm) in enumerate(
1082 zip(cases, arm_names([c[0] for c in cases])), 1):
1083 zip(cases, arm_names([c[0] for c in cases])), 1):
@@ -1166,7 +1167,7 @@ def generate_tests(golden):
1166 call, name, expected_modules, ' '.join(module_fixtures))
1167 call, name, expected_modules, ' '.join(module_fixtures))
1167 arms.append('++ %s\n %s' % (arm, call))
1168 arms.append('++ %s\n %s' % (arm, call))
1168 if has_module_types:
1169 if has_module_types:
1169− lines.append('=/ prepared-prelude (prepare-prelude:jibb prelude-source)')
1170+ lines.append('=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)')
1170 lines.append('|%')
1171 lines.append('|%')
1171 if arms:
1172 if arms:
1172 lines.append(':: one arm per case')
1173 lines.append(':: one arm per case')
@@ -1289,7 +1290,7 @@ def generate_tests(golden):
1289 =/ sources=(list [path=path source=@t])
1290 =/ sources=(list [path=path source=@t])
1290 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
1291 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
1291 ?~ prepared-prelude
1292 ?~ prepared-prelude
1292− (golden-types-with-prelude:jibb at src external mark-external sources prelude-source)
1293+ (golden-types-with-prelude-and-internal:jibb at src external mark-external sources prelude-source internal-source)
1293 (golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)
1294 (golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)
1294'''
1295'''
1295 return '\n'.join(lines) + '\n' + TESTS_HELPERS.replace('\n--\n', '\n' + types_helper + '--\n')
1296 return '\n'.join(lines) + '\n' + TESTS_HELPERS.replace('\n--\n', '\n' + types_helper + '--\n')
tools/testdata/selftest+10−10
@@ -325,16 +325,16 @@ def check_empty_module_bundle(c, tmp):
325 with open(os.path.join(folder, 'about.txt'), 'a') as f:
325 with open(os.path.join(folder, 'about.txt'), 'a') as f:
326 f.write('expect-types: test module input\n')
326 f.write('expect-types: test module input\n')
327 lib, _ = stub_with(tmp, 'module-stub.hoon', '--',
327 lib, _ = stub_with(tmp, 'module-stub.hoon', '--',
328− "++ prepare-prelude\n"
328+ "++ prepare-prelude-with-internal\n"
329− " |= prelude=@t\n"
329+ " |= [prelude=@t internal=@t]\n"
330 " ^- (unit @t)\n"
330 " ^- (unit @t)\n"
331 " `prelude\n"
331 " `prelude\n"
332 "++ golden-types-with-prepared-prelude\n"
332 "++ golden-types-with-prepared-prelude\n"
333 " |= [file=path src=@t surs=* marks=* modules=* prelude=(unit @t)]\n"
333 " |= [file=path src=@t surs=* marks=* modules=* prelude=(unit @t)]\n"
334 " ^- @t\n"
334 " ^- @t\n"
335 " ?~(prelude 'missing prelude' ?~(modules 'empty module bundle' 'unexpected modules'))\n"
335 " ?~(prelude 'missing prelude' ?~(modules 'empty module bundle' 'unexpected modules'))\n"
336− "++ golden-types-with-prelude\n"
336+ "++ golden-types-with-prelude-and-internal\n"
337− " |= [file=path src=@t surs=* marks=* modules=* prelude=@t]\n"
337+ " |= [file=path src=@t surs=* marks=* modules=* prelude=@t internal=@t]\n"
338 " ^- @t\n"
338 " ^- @t\n"
339 " ?~(prelude 'missing prelude' ?~(modules 'empty module bundle' 'unexpected modules'))\n"
339 " ?~(prelude 'missing prelude' ?~(modules 'empty module bundle' 'unexpected modules'))\n"
340 "--")
340 "--")
@@ -347,20 +347,20 @@ def check_empty_module_bundle(c, tmp):
347 c.expect(not os.path.exists(os.path.join(folder, 'module-trees.txt')),
347 c.expect(not os.path.exists(os.path.join(folder, 'module-trees.txt')),
348 'empty bundle should not require a fixture tree output')
348 'empty bundle should not require a fixture tree output')
349 generated = read(program)
349 generated = read(program)
350− c.expect(generated.count(b'(prepare-prelude:lib ') == 1 and
350+ c.expect(generated.count(b'(prepare-prelude-with-internal:lib ') == 1 and
351− generated.find(b'|^ %+ rap') > generated.find(b'(prepare-prelude:lib '),
351+ generated.find(b'|^ %+ rap') > generated.find(b'(prepare-prelude-with-internal:lib '),
352 'prelude preparation should occur once before the case loop')
352 'prelude preparation should occur once before the case loop')
353 fallback, _ = stub_with(tmp, 'fallback-stub.hoon', '--',
353 fallback, _ = stub_with(tmp, 'fallback-stub.hoon', '--',
354− "++ prepare-prelude\n"
354+ "++ prepare-prelude-with-internal\n"
355− " |= prelude=@t\n"
355+ " |= [prelude=@t internal=@t]\n"
356 " ^- (unit @t)\n"
356 " ^- (unit @t)\n"
357 " ~\n"
357 " ~\n"
358 "++ golden-types-with-prepared-prelude\n"
358 "++ golden-types-with-prepared-prelude\n"
359 " |= [file=path src=@t surs=* marks=* modules=* prelude=(unit @t)]\n"
359 " |= [file=path src=@t surs=* marks=* modules=* prelude=(unit @t)]\n"
360 " ^- @t\n"
360 " ^- @t\n"
361 " 'unexpected prepared path'\n"
361 " 'unexpected prepared path'\n"
362− "++ golden-types-with-prelude\n"
362+ "++ golden-types-with-prelude-and-internal\n"
363− " |= [file=path src=@t surs=* marks=* modules=* prelude=@t]\n"
363+ " |= [file=path src=@t surs=* marks=* modules=* prelude=@t internal=@t]\n"
364 " ^- @t\n"
364 " ^- @t\n"
365 " 'prelude preparation failed'\n"
365 " 'prelude preparation failed'\n"
366 "--")
366 "--")
tools/testdata/ship-selftest+3−2
@@ -171,9 +171,10 @@ def generator_checks(tmp):
171 check('Jibb module sources are also supplied to the partial checker',
171 check('Jibb module sources are also supplied to the partial checker',
172 '(check-module-types ~.main' in out and
172 '(check-module-types ~.main' in out and
173 '/* prelude-source %jibb /lib/jibb/prelude/jibb' in out and
173 '/* prelude-source %jibb /lib/jibb/prelude/jibb' in out and
174+ '/* internal-source %jibb /lib/jibb/internal/jibb' in out and
174− '=/ prepared-prelude (prepare-prelude:jibb prelude-source)' in out and
175+ '=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)' in out and
175 '(golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)' in out and
176 '(golden-types-with-prepared-prelude:jibb at src external mark-external sources prepared-prelude)' in out and
176− '(golden-types-with-prelude:jibb at src external mark-external sources prelude-source)' in out and
177+ '(golden-types-with-prelude-and-internal:jibb at src external mark-external sources prelude-source internal-source)' in out and
177 "['/ui/card.jibb' ~[~.ui ~.card ~.jibb] mod-1-1]" in out and
178 "['/ui/card.jibb' ~[~.ui ~.card ~.jibb] mod-1-1]" in out and
178 'src-1 `typ-1 ~ ~ ~[[' in out and '~[]' not in out, out)
179 'src-1 `typ-1 ~ ~ ~[[' in out and '~[]' not in out, out)
179 with open(os.path.join(folder, 'modules.txt'), 'w') as f:
180 with open(os.path.join(folder, 'modules.txt'), 'w') as f:
tools/type-module-scope-test+2−1
@@ -12,7 +12,7 @@ fixture = root / 'tests/type-module-scope/expected.txt'
12tests = (root / 'tests/lib/jibb-module-scope.hoon').read_text()
12tests = (root / 'tests/lib/jibb-module-scope.hoon').read_text()
13tests = tests[tests.index('\n|%\n') + 1:]
13tests = tests[tests.index('\n|%\n') + 1:]
14expression = ('=/ jibb .\n=/ expected=wain (to-wain:format expected-text)\n'
14expression = ('=/ jibb .\n=/ expected=wain (to-wain:format expected-text)\n'
15− '=/ real-prelude=@t prelude-text\n=/ real-source=@t source-text\n'
15+ '=/ real-prelude=@t prelude-text\n=/ real-internal=@t internal-text\n=/ real-source=@t source-text\n'
16 '=/ real-left=@t left-text\n=/ real-right=@t right-text\n'
16 '=/ real-left=@t left-text\n=/ real-right=@t right-text\n'
17 '=/ real-expected=wain (to-wain:format types-text)\n'
17 '=/ real-expected=wain (to-wain:format types-text)\n'
18 '=/ suite\n' + tests + '\nscope-output:suite\n')
18 '=/ suite\n' + tests + '\nscope-output:suite\n')
@@ -22,6 +22,7 @@ with tempfile.TemporaryDirectory(prefix='jibb-module-scope-') as tmp:
22 result = subprocess.run([str(root / 'tools/hoon'), '--raw', '-f', str(program),
22 result = subprocess.run([str(root / 'tools/hoon'), '--raw', '-f', str(program),
23 '--cord', 'expected-text=' + str(fixture),
23 '--cord', 'expected-text=' + str(fixture),
24 '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
24 '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
25+ '--cord', 'internal-text=' + str(root / 'jibb-dev/lib/jibb/internal.jibb'),
25 '--cord', 'source-text=' + str(root / 'tests/golden/types-prelude-interface/source.jibb'),
26 '--cord', 'source-text=' + str(root / 'tests/golden/types-prelude-interface/source.jibb'),
26 '--cord', 'left-text=' + str(root / 'tests/golden/types-prelude-interface/modules/ui/left.jibb'),
27 '--cord', 'left-text=' + str(root / 'tests/golden/types-prelude-interface/modules/ui/left.jibb'),
27 '--cord', 'right-text=' + str(root / 'tests/golden/types-prelude-interface/modules/ui/right.jibb'),
28 '--cord', 'right-text=' + str(root / 'tests/golden/types-prelude-interface/modules/ui/right.jibb'),
tools/type-poke-testnew file+50
@@ -0,0 +1,50 @@
1+#!/usr/bin/env python3
2+"""Compare the source-backed private poke/API fixture under urbit eval."""
3+
4+from pathlib import Path
5+import argparse
6+import difflib
7+import subprocess
8+import sys
9+import tempfile
10+
11+root = Path(__file__).resolve().parent.parent
12+parser = argparse.ArgumentParser(description=__doc__)
13+parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
14+parser.add_argument('--update', action='store_true')
15+args = parser.parse_args()
16+fixture = root / 'tests/type-poke'
17+names = ('mark', 'api', 'client', 'direct', 'alias', 'public', 'fake',
18+ 'exported', 'transitive', 'inner', 'impostor-client', 'impostor')
19+reader = (root / 'jibb-dev/lib/jibb-import.hoon').read_text()
20+tests = (root / 'tests/lib/jibb-poke-bridge.hoon').read_text()
21+tests = tests[tests.index('\n|%\n') + 1:]
22+expression = ('=/ jibb .\n=/ jibb-import\n' + reader +
23+ '\n=/ prelude=@t prelude-text\n=/ internal=@t internal-text\n' +
24+ ''.join('=/ ' + n + '=wain (to-wain:format ' + n + '-text)\n' for n in names) +
25+ '=/ expected=wain (to-wain:format expected-text)\n' +
26+ '=/ bridge\n' + tests +
27+ '\n(bridge-output:bridge prelude internal ' + ' '.join(n + '-text' for n in names) + ')\n')
28+with tempfile.TemporaryDirectory(prefix='jibb-type-poke-') as tmp:
29+ program = Path(tmp) / 'bridge.hoon'
30+ program.write_text(expression)
31+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(program),
32+ '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
33+ '--cord', 'internal-text=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
34+ for name in names + ('expected',):
35+ command += ['--cord', name + '-text=' + str(fixture / (name + '.txt'))]
36+ result = subprocess.run(command, stdout=subprocess.PIPE)
37+if result.returncode:
38+ sys.exit(result.returncode)
39+expected = (fixture / 'expected.txt').read_bytes()
40+if args.update:
41+ (fixture / 'expected.txt').write_bytes(result.stdout)
42+ print('updated private poke/API bridge golden')
43+ sys.exit(0)
44+if result.stdout != expected:
45+ sys.stderr.writelines(difflib.unified_diff(
46+ expected.decode().splitlines(keepends=True),
47+ result.stdout.decode().splitlines(keepends=True),
48+ fromfile='expected.txt', tofile='actual types'))
49+ sys.exit(1)
50+print('private poke/API bridge golden passed')