@mark1russell7/coeval 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -2071,7 +2071,7 @@ function context(parts = {}) {
2071
2071
  };
2072
2072
  }
2073
2073
  const MAX_COLLAPSE = 64;
2074
- const NO_HOPS = /* @__PURE__ */ Object.freeze([]);
2074
+ const NO_HOPS$1 = /* @__PURE__ */ Object.freeze([]);
2075
2075
  /** A value that can be a reference document: a record with the type `ref`. The full check comes after. */
2076
2076
  function mayBeRef(thing) {
2077
2077
  return typeof thing === "object" && thing !== null && thing.type === "ref";
@@ -2122,13 +2122,13 @@ function walkQuick(start, path, plain, keyed) {
2122
2122
  ok: false,
2123
2123
  code: "#N/A",
2124
2124
  reason: `The path ${keys.join(".")} reaches nothing.`,
2125
- hops: NO_HOPS
2125
+ hops: NO_HOPS$1
2126
2126
  };
2127
2127
  if (!plain && mayBeRef(reached.thing)) return void 0;
2128
2128
  return {
2129
2129
  ok: true,
2130
2130
  thing: reached.thing,
2131
- hops: NO_HOPS
2131
+ hops: NO_HOPS$1
2132
2132
  };
2133
2133
  }
2134
2134
  const step = path[index];
@@ -2145,7 +2145,7 @@ function walkQuick(start, path, plain, keyed) {
2145
2145
  return {
2146
2146
  ok: true,
2147
2147
  thing: here,
2148
- hops: NO_HOPS
2148
+ hops: NO_HOPS$1
2149
2149
  };
2150
2150
  }
2151
2151
  /** The root whose value starts the short path of a compiled path. `FULL` takes the full algorithm at once. */
@@ -2256,7 +2256,7 @@ function resolve(nav, ctx, path, options = {}) {
2256
2256
  * @returns What the path reached and each hop, or an error.
2257
2257
  */
2258
2258
  function resolveFully$1(nav, ctx, path, hops, known) {
2259
- const done = hops ?? NO_HOPS;
2259
+ const done = hops ?? NO_HOPS$1;
2260
2260
  const failed = (code, reason) => ({
2261
2261
  ok: false,
2262
2262
  code,
@@ -3054,6 +3054,7 @@ var Session = class {
3054
3054
  if (reading === void 0) return this.find(ctx, path, compiled, hops);
3055
3055
  const free = isFree(reading.root, ctx, path);
3056
3056
  if (!free && path[0] === "self" && !reading.self) this.keep(reading, ["self"]);
3057
+ else if (free && path.length === 1 && path[0] === "self") reading.self = true;
3057
3058
  let found;
3058
3059
  try {
3059
3060
  found = this.find(ctx, path, compiled, hops);
@@ -4290,6 +4291,7 @@ const STD_WORLD = {
4290
4291
  caps: [{ rule: "mask" }],
4291
4292
  pure: true,
4292
4293
  lazy: [{}],
4294
+ reads: ["self"],
4293
4295
  summary: "A node of a tree. Each part is an attribute that evaluates on demand, one time, with the node as self."
4294
4296
  },
4295
4297
  box: {
@@ -4309,6 +4311,7 @@ const STD_WORLD = {
4309
4311
  caps: [{ rule: "mask" }],
4310
4312
  pure: true,
4311
4313
  lazy: [{}],
4314
+ reads: ["self"],
4312
4315
  summary: "A node of a tree, as panel. A formula in a box can read its parent and its siblings."
4313
4316
  },
4314
4317
  math: { kinds: {
@@ -4553,11 +4556,12 @@ function plainOf(value, path) {
4553
4556
  * step `type` gives its type. Another step reads an attribute through its ladder (TREE.LADDER). The rungs are a part of
4554
4557
  * the node, an equation of its kind and an equation `down` of the kind of its parent. A copy from the parent, then a
4555
4558
  * fold or a default, come last. A failed attribute throws `Failure` with its own error, thus a reference to it gives that error.
4559
+ * The argument `outer` is the self of the context, that `treeNode` resolved. The node reads no root of the context directly (C4).
4556
4560
  */
4557
- function treeThing(input, build) {
4561
+ function treeThing(input, build, outer) {
4558
4562
  const { parts, context, kind: type, place, machine } = input;
4559
4563
  const { tree, of } = contractOf$1(machine, input.typePath);
4560
- const above = stateOf(context.self);
4564
+ const above = stateOf(outer);
4561
4565
  const up = above !== void 0 && above.build === build ? above : void 0;
4562
4566
  const cells = /* @__PURE__ */ new Map();
4563
4567
  /** The positions of the items of the list `children`, for the names of the children. */
@@ -4721,7 +4725,7 @@ function treeThing(input, build) {
4721
4725
  type,
4722
4726
  label: `node ${type}`,
4723
4727
  deref(key) {
4724
- if (key === "parent") return context.self;
4728
+ if (key === "parent") return outer;
4725
4729
  if (key === "type") return type;
4726
4730
  const result = read(String(key));
4727
4731
  if (result === void 0) return void 0;
@@ -4752,15 +4756,22 @@ function treeThing(input, build) {
4752
4756
  function attributeTrace(node, attribute) {
4753
4757
  return stateOf(node)?.trace(attribute);
4754
4758
  }
4759
+ /** The path of the root `self`. A node of the tree resolves it, thus the list of reads holds the read (C4). */
4760
+ const SELF_PATH = /* @__PURE__ */ Object.freeze(["self"]);
4761
+ /** The options of the resolution of `self`: the node needs no hops. */
4762
+ const NO_HOPS = /* @__PURE__ */ Object.freeze({ hops: false });
4755
4763
  /**
4756
4764
  * This function evaluates a node of the decorated tree. Inside an attribute of an open tree, the node gives its host
4757
- * thing, and no attribute evaluates. Else the node is the root of a new tree, and it gives the JSON of the tree.
4765
+ * thing, and no attribute evaluates. Else the node is the root of a new tree, and it gives the JSON of the tree. The
4766
+ * node reads `self` through `resolve` (C4, D44). A machine that closes the root `self` thus gives no nested trees.
4758
4767
  */
4759
4768
  function treeNode(input) {
4760
- const above = stateOf(input.context.self);
4761
- if (above !== void 0 && above.build.open) return ok(treeThing(input, above.build));
4769
+ const found = input.resolve(SELF_PATH, NO_HOPS);
4770
+ const outer = found.ok ? found.thing : void 0;
4771
+ const above = stateOf(outer);
4772
+ if (above !== void 0 && above.build.open) return ok(treeThing(input, above.build, outer));
4762
4773
  const build = { open: true };
4763
- const root = treeThing(input, build);
4774
+ const root = treeThing(input, build, outer);
4764
4775
  try {
4765
4776
  return stateOf(root).json(/* @__PURE__ */ new Set());
4766
4777
  } finally {
@@ -5847,6 +5858,66 @@ function typeCheck(machine, doc, options = {}) {
5847
5858
  places: pass.places
5848
5859
  };
5849
5860
  }
5861
+ /** This function tells if a table of verbs has an entry for a verb. */
5862
+ function hasVerb(table, verb) {
5863
+ return table !== void 0 && Object.hasOwn(table, verb);
5864
+ }
5865
+ /**
5866
+ * This function checks the world of a machine before a document exists. It finds each kind that has no entry for a
5867
+ * verb of the list, when the world has no default for that verb (STATIC.COVERAGE). A document of such a kind gets no
5868
+ * evaluator for the verb, thus the check gives the same proof of coverage as a type system.
5869
+ *
5870
+ * The check visits each kind of each namespace, at each depth, and the fallback kind of each namespace and of the
5871
+ * world. It does not follow an alias, because the kind of an alias has its own place. The check reads only the world.
5872
+ *
5873
+ * @param machine - The machine, for its world.
5874
+ * @param verbs - The verbs that each kind of the language must answer, for example `eval`, `view` and `type`.
5875
+ * @returns One issue for each kind and verb without an evaluator. The order is the order of the world, then the
5876
+ * order of the verbs. The fallback kind of a namespace comes after the entries of that namespace.
5877
+ */
5878
+ function checkWorld(machine, verbs) {
5879
+ const world = machine.world;
5880
+ const open = verbs.filter((verb) => !hasVerb(world.defaults, verb));
5881
+ const out = [];
5882
+ if (open.length === 0) return out;
5883
+ const visit = (kind, path, fallback) => {
5884
+ const text = path.join(".");
5885
+ const name = fallback ? path.length === 0 ? "the fallback kind of the world" : `the fallback kind of ${text}` : `the kind ${text}`;
5886
+ for (const verb of open) {
5887
+ if (hasVerb(kind.verbs, verb)) continue;
5888
+ const reason = `${name.charAt(0).toUpperCase()}${name.slice(1)} has no entry for the verb ${verb}, and the world has no default for it.`;
5889
+ out.push(fallback ? {
5890
+ code: "#NOEVAL",
5891
+ kind: path,
5892
+ fallback: true,
5893
+ verb,
5894
+ reason
5895
+ } : {
5896
+ code: "#NOEVAL",
5897
+ kind: path,
5898
+ verb,
5899
+ reason
5900
+ });
5901
+ }
5902
+ };
5903
+ const way = /* @__PURE__ */ new Set();
5904
+ const entries = (kinds, path) => {
5905
+ for (const key of Object.keys(kinds)) {
5906
+ const entry = kinds[key];
5907
+ const here = [...path, key];
5908
+ if (isKind(entry)) visit(entry, here, false);
5909
+ else if (isNamespace(entry) && !way.has(entry)) {
5910
+ way.add(entry);
5911
+ entries(entry.kinds, here);
5912
+ if (entry.fallback !== void 0) visit(entry.fallback, here, true);
5913
+ way.delete(entry);
5914
+ }
5915
+ }
5916
+ };
5917
+ entries(world.kinds, []);
5918
+ if (world.fallback !== void 0) visit(world.fallback, [], true);
5919
+ return out;
5920
+ }
5850
5921
  /** The names that an equation of `down` sees (TREE.DOWN). */
5851
5922
  const DOWN_NAMES = /* @__PURE__ */ Object.freeze([
5852
5923
  "child",
@@ -6178,7 +6249,8 @@ function partLazy(above, parent, slot) {
6178
6249
  * by the contracts of its kinds:
6179
6250
  *
6180
6251
  * - `reads`: each free reference, with the root and the keys of its path. A read under a lazy part has the mark
6181
- * `lazy`, for example a read in a branch of `if`. A read after a step document has `exact: false`.
6252
+ * `lazy`, for example a read in a branch of `if`. A read after a step document has `exact: false`. A kind that
6253
+ * declares `reads` adds a read of each of its roots at each document of the kind.
6182
6254
  * - `side` and `effects`: from the contract of each kind.
6183
6255
  * - `pure`: each kind declares `pure`, and the document has no effect and is not volatile.
6184
6256
  * - `volatile`: a kind, an operation or a step document declares `volatile`, or the host marks a read.
@@ -6231,18 +6303,35 @@ function factsOf(machine, doc, options = {}) {
6231
6303
  }
6232
6304
  const code = codeOf(world, v.declared ? void 0 : v.doc.own, kind, verb, "eval");
6233
6305
  const answer = code.name === void 0 ? void 0 : hook?.(v.typePath ?? [], code.name);
6306
+ let roots;
6234
6307
  if (code.described) {
6235
6308
  note(answer?.pure ?? kind.pure, answer?.volatile ?? kind.volatile);
6236
6309
  above.set(v, {
6237
6310
  lazy,
6238
6311
  rules: answer?.lazy ?? kind.lazy
6239
6312
  });
6313
+ roots = answer?.reads ?? kind.reads;
6240
6314
  } else {
6241
6315
  note(answer?.pure, answer?.volatile);
6242
6316
  above.set(v, {
6243
6317
  lazy,
6244
6318
  rules: answer?.lazy ?? EACH$1
6245
6319
  });
6320
+ roots = answer?.reads;
6321
+ }
6322
+ for (const root of roots ?? NONE) {
6323
+ const read = {
6324
+ root,
6325
+ keys: NONE,
6326
+ exact: true,
6327
+ lazy,
6328
+ address: false,
6329
+ path: [root],
6330
+ place: tight(v.place),
6331
+ at: tight(v.at)
6332
+ };
6333
+ reads.push(read);
6334
+ if (options.volatile?.(read) === true) volatile = true;
6246
6335
  }
6247
6336
  if (kind.side === "run") side = "run";
6248
6337
  for (const keys of declaredEffects(v)) {
@@ -7060,22 +7149,110 @@ function formulaTypes(profile) {
7060
7149
  * This function makes the evaluators of the formula kit for one language. Each evaluator compiles its document
7061
7150
  * one time into code. Each evaluator also holds its type rule, for a check of types (TYPE.SYNTH).
7062
7151
  *
7152
+ * Equal profiles give the same evaluator objects (COMPOSE.UNIFY, D46). Thus two machines of one profile merge without
7153
+ * a conflict. Each call gives a new record. Each evaluator object is frozen, because many machines can share it.
7154
+ *
7063
7155
  * @param profile - The operations and the rules of the language.
7064
7156
  * @returns The evaluators, by their name.
7065
7157
  */
7066
7158
  function formulaEvaluators(profile = {}) {
7159
+ return { ...kitOf(profile).evaluators };
7160
+ }
7161
+ /** This function makes new evaluators of the formula kit for the fields of one profile. */
7162
+ function makeEvaluators(profile) {
7067
7163
  const evaluators = formulaCode(profile);
7068
7164
  const types = formulaTypes(profile);
7069
7165
  const out = {};
7070
7166
  for (const name of Object.keys(evaluators)) {
7071
7167
  const evaluator = evaluators[name];
7072
7168
  const type = Object.hasOwn(types, name) ? types[name] : void 0;
7073
- out[name] = type === void 0 ? evaluator : {
7169
+ out[name] = Object.freeze(type === void 0 ? evaluator : {
7074
7170
  compile: evaluator.compile,
7075
7171
  type
7172
+ });
7173
+ }
7174
+ return Object.freeze(out);
7175
+ }
7176
+ /** The keys of a profile that the kit reads. The kit ignores each other key. */
7177
+ const PROFILE_KEYS = /* @__PURE__ */ Object.freeze([
7178
+ "ops",
7179
+ "lazy",
7180
+ "ext",
7181
+ "truthy",
7182
+ "otherwise",
7183
+ "logic",
7184
+ "omit",
7185
+ "missing",
7186
+ "check",
7187
+ "combine",
7188
+ "pure",
7189
+ "volatile",
7190
+ "sigs"
7191
+ ]);
7192
+ /** The number of recent kits that a profile in a new object can find by its fields. */
7193
+ const RECENT_KITS = 16;
7194
+ /** The kit of each profile object. A kit goes when its profile object goes. */
7195
+ const kitsByProfile = /* @__PURE__ */ new WeakMap();
7196
+ /** The recent kits, the most recent first. The list holds `RECENT_KITS` kits or fewer. */
7197
+ const recentKits = [];
7198
+ /**
7199
+ * This function gives the canonical form of a profile: a frozen record of the fields that the kit reads. A field
7200
+ * with the value `undefined` is absent, but `otherwise` is present when the profile has it as an own key. A list
7201
+ * is a frozen copy. Each other value stays the same object.
7202
+ */
7203
+ function fieldsOf(profile) {
7204
+ const out = {};
7205
+ for (const key of PROFILE_KEYS) {
7206
+ if (key === "otherwise" ? !Object.hasOwn(profile, key) : profile[key] === void 0) continue;
7207
+ const value = profile[key];
7208
+ out[key] = Array.isArray(value) ? Object.freeze([...value]) : value;
7209
+ }
7210
+ return Object.freeze(out);
7211
+ }
7212
+ /**
7213
+ * This function tells if two canonical forms are equal. They must have the same keys. A function, a record and a host
7214
+ * value are equal only to themselves. Two lists are equal when their items are the same, in order.
7215
+ */
7216
+ function sameFields(a, b) {
7217
+ const left = a;
7218
+ const right = b;
7219
+ const keys = Object.keys(left);
7220
+ if (keys.length !== Object.keys(right).length) return false;
7221
+ return keys.every((key) => {
7222
+ if (!Object.hasOwn(right, key)) return false;
7223
+ const x = left[key];
7224
+ const y = right[key];
7225
+ if (Object.is(x, y)) return true;
7226
+ return Array.isArray(x) && Array.isArray(y) && x.length === y.length && x.every((item, index) => Object.is(item, y[index]));
7227
+ });
7228
+ }
7229
+ /**
7230
+ * This function gives the kit of a profile (D46). A profile object that the kit knows, with the same fields, gives its
7231
+ * kit. Then a recent kit with equal fields serves a new profile object. Else the function makes a new kit from the
7232
+ * canonical form. Thus a later change of a field of the profile object gives a new kit, and an old kit does not change.
7233
+ */
7234
+ function kitOf(profile) {
7235
+ const fields = fieldsOf(profile);
7236
+ const known = kitsByProfile.get(profile);
7237
+ if (known !== void 0 && sameFields(known.fields, fields)) return known;
7238
+ const index = recentKits.findIndex((kit) => sameFields(kit.fields, fields));
7239
+ let kit;
7240
+ if (index >= 0) {
7241
+ kit = recentKits[index];
7242
+ recentKits.splice(index, 1);
7243
+ } else {
7244
+ const hook = makeKnown(fields);
7245
+ kit = {
7246
+ fields,
7247
+ evaluators: makeEvaluators(fields),
7248
+ known: hook,
7249
+ facts: makeFacts(fields, hook)
7076
7250
  };
7077
7251
  }
7078
- return out;
7252
+ recentKits.unshift(kit);
7253
+ if (recentKits.length > RECENT_KITS) recentKits.length = RECENT_KITS;
7254
+ kitsByProfile.set(profile, kit);
7255
+ return kit;
7079
7256
  }
7080
7257
  /** This function makes the code of the evaluators of the formula kit, without their type rules. */
7081
7258
  function formulaCode(profile) {
@@ -7394,10 +7571,16 @@ function formulaCode(profile) {
7394
7571
  * `formula.ext` knows an extension of `ext` and each standard extension. The hook knows each name of the other
7395
7572
  * evaluators.
7396
7573
  *
7574
+ * Equal profiles give the same hook (D46).
7575
+ *
7397
7576
  * @param profile - The operations and the extensions of the language.
7398
7577
  * @returns The hook: `true`, or the reason of the `#NAME?` that the evaluator gives in a run.
7399
7578
  */
7400
7579
  function formulaKnown(profile = {}) {
7580
+ return kitOf(profile).known;
7581
+ }
7582
+ /** This function makes a new hook `known` for the fields of one profile. */
7583
+ function makeKnown(profile) {
7401
7584
  const hasOp = (name) => {
7402
7585
  if (profile.lazy !== void 0 && Object.hasOwn(profile.lazy, name)) return true;
7403
7586
  const ops = profile.ops;
@@ -7431,13 +7614,18 @@ const EACH_PART = /* @__PURE__ */ Object.freeze([/* @__PURE__ */ Object.freeze({
7431
7614
  * - An operation is pure when the profile names it in `pure`, or when `pure` is `true`. A volatile operation is not pure.
7432
7615
  * - A standard extension is pure. An extension of the profile gets the context, thus it is not pure.
7433
7616
  *
7617
+ * Equal profiles give the same hook (D46).
7618
+ *
7434
7619
  * @param profile - The operations, the extensions and their facts.
7435
7620
  * @returns The hook: the facts of a name, or `undefined` for the facts of the contract.
7436
7621
  */
7437
7622
  function formulaFacts(profile = {}) {
7623
+ return kitOf(profile).facts;
7624
+ }
7625
+ /** This function makes a new hook `facts` for the fields of one profile, with the hook `known` of the same fields. */
7626
+ function makeFacts(profile, known) {
7438
7627
  const volatile = new Set(profile.volatile ?? []);
7439
7628
  const pure = profile.pure === true ? void 0 : new Set(profile.pure ?? []);
7440
- const known = formulaKnown(profile);
7441
7629
  return (path, code) => {
7442
7630
  if (code !== "formula.op" && code !== "formula.ext") return void 0;
7443
7631
  const name = path.slice(1).join(".");
@@ -7465,18 +7653,23 @@ function formulaFacts(profile = {}) {
7465
7653
  * The kit gives the domains of the kernel (`STD_DOMAINS`). Thus a domain of the language with the name `number` is a
7466
7654
  * conflict. The language names `["domains", "number"]` in `replaces` to replace it.
7467
7655
  *
7656
+ * Equal profiles give the same evaluators and the same hooks (COMPOSE.UNIFY, D46). Thus two machines of one profile
7657
+ * merge, also when each adds its own language. Two profiles with different fields give different evaluators, and
7658
+ * their machines conflict at each evaluator name of the kit.
7659
+ *
7468
7660
  * @param profile - The operations and the rules of the language.
7469
7661
  * @param more - The parts of a machine that the language adds, with the paths of the entries that it replaces.
7470
7662
  * @returns The machine.
7471
7663
  * @throws {MergeError} The language and the kit have a conflict.
7472
7664
  */
7473
7665
  function formulaMachine(profile = {}, more = {}) {
7666
+ const kit = kitOf(profile);
7474
7667
  return mergeMachines({
7475
7668
  world: { kinds: formulaKinds() },
7476
- evaluators: formulaEvaluators(profile),
7669
+ evaluators: { ...kit.evaluators },
7477
7670
  domains: STD_DOMAINS,
7478
- known: formulaKnown(profile),
7479
- facts: formulaFacts(profile)
7671
+ known: kit.known,
7672
+ facts: kit.facts
7480
7673
  }, more);
7481
7674
  }
7482
7675
  //#endregion
@@ -8822,10 +9015,13 @@ function plainValue(value, open) {
8822
9015
  }
8823
9016
  /**
8824
9017
  * TREE.LAZY, TREE.PARENT, TREE.SIBLING and TREE.ERROR: a node of an open tree gives its thing, and the root of a new
8825
- * tree gives its JSON. A step on the thing reads an attribute, and a failed attribute throws its own error.
9018
+ * tree gives its JSON. A step on the thing reads an attribute, and a failed attribute throws its own error. The node
9019
+ * reads `self` only through `resolve` (C4, TREE.SELF).
8826
9020
  */
8827
- const treeDefinition = ({ parts, context, kind, place, machine, typePath }) => {
8828
- const outer = refNodeOf(context.self);
9021
+ const treeDefinition = ({ parts, context, kind, place, machine, typePath, resolve: walk }) => {
9022
+ const reached = walk(["self"]);
9023
+ const parent = reached.ok ? reached.thing : void 0;
9024
+ const outer = refNodeOf(parent);
8829
9025
  const nested = outer !== void 0 && outer.tree.open;
8830
9026
  const found = machine === void 0 || typePath.length === 0 ? void 0 : lookupKind(machine.world, typePath);
8831
9027
  const contract = found?.ok === true ? found.kind.tree : void 0;
@@ -8849,7 +9045,7 @@ const treeDefinition = ({ parts, context, kind, place, machine, typePath }) => {
8849
9045
  type: kind,
8850
9046
  label: `node ${kind}`,
8851
9047
  deref: (key) => {
8852
- if (key === "parent") return context.self;
9048
+ if (key === "parent") return parent;
8853
9049
  if (key === "type") return kind;
8854
9050
  const result = attributeOf(node, String(key));
8855
9051
  if (result === void 0 || result.ok) return result?.ok === true ? result.value : void 0;
@@ -11890,6 +12086,6 @@ function typeFromSamples(values, options = {}) {
11890
12086
  return samplesAt(values, options.closed === true, 0);
11891
12087
  }
11892
12088
  //#endregion
11893
- export { ATTRIBUTE_RUNGS, CAPS_TYPE, CONSTRUCTS, ENVELOPE_KEYS, Failure, Held, JOURNAL, MergeError, PARTS, PART_INFO, ROOTS, RUNGS, STD_CAPS, STD_DEFINITIONS, STD_DOMAINS, STD_EVALUATORS, STD_EXT, STD_MACHINE, STD_RUNNERS, STD_SYNTAX, STD_WALKERS, STD_WORLD, THING, agree, ask, attributeTrace, capKeys, check, checkLatent, checkSteps, classify, components, conforms, context, cycles, dataEdges, decodeDomain, decodeValue, derefStep, describe, docEquals, durable, edgesOf, effectEdges, effectsOf, encodeValue, entriesAsJson, equationType, evaluate, extendDomain, factsOf, fail, failures, field, fits, flatten, formulaDefinitions, formulaEvaluators, formulaFacts, formulaKinds, formulaKnown, formulaMachine, fromJson, generate, heights, intersectCaps, isAlias, isAllowedOrder, isClosure, isEnvelope, isHostThing, isKey, isKind, isNamespace, isRecord, isRef, isStackOverflow, isTypeRef, join, jsTruthy, kindDocument, kindNamed, kindOf, layers, looksLikeKind, lookupKind, makeContext, mapRefs, member, mergeMachines, mergeWorlds, narrow, nearestWalker, necessary, nodeAt, nodeLayers, ok, parse, partCaps, partsOf, pathMatches, permits, placed, planner, prepare, print, random, recorder, ref, reference, refsOf, replayer, resolve, restrictMachine, restrictWorld, run, sameResult, sameValue, schedule, splitParts, stored, syntaxFormat, tag, thrown, toJson, typeCheck, typeFromSamples, typeFromSchema, typeIssues, typeName, typePath, typeText, typed, typesOf, valueOfThing, verifyReads, walk, worldThing };
12089
+ export { ATTRIBUTE_RUNGS, CAPS_TYPE, CONSTRUCTS, ENVELOPE_KEYS, Failure, Held, JOURNAL, MergeError, PARTS, PART_INFO, ROOTS, RUNGS, STD_CAPS, STD_DEFINITIONS, STD_DOMAINS, STD_EVALUATORS, STD_EXT, STD_MACHINE, STD_RUNNERS, STD_SYNTAX, STD_WALKERS, STD_WORLD, THING, agree, ask, attributeTrace, capKeys, check, checkLatent, checkSteps, checkWorld, classify, components, conforms, context, cycles, dataEdges, decodeDomain, decodeValue, derefStep, describe, docEquals, durable, edgesOf, effectEdges, effectsOf, encodeValue, entriesAsJson, equationType, evaluate, extendDomain, factsOf, fail, failures, field, fits, flatten, formulaDefinitions, formulaEvaluators, formulaFacts, formulaKinds, formulaKnown, formulaMachine, fromJson, generate, heights, intersectCaps, isAlias, isAllowedOrder, isClosure, isEnvelope, isHostThing, isKey, isKind, isNamespace, isRecord, isRef, isStackOverflow, isTypeRef, join, jsTruthy, kindDocument, kindNamed, kindOf, layers, looksLikeKind, lookupKind, makeContext, mapRefs, member, mergeMachines, mergeWorlds, narrow, nearestWalker, necessary, nodeAt, nodeLayers, ok, parse, partCaps, partsOf, pathMatches, permits, placed, planner, prepare, print, random, recorder, ref, reference, refsOf, replayer, resolve, restrictMachine, restrictWorld, run, sameResult, sameValue, schedule, splitParts, stored, syntaxFormat, tag, thrown, toJson, typeCheck, typeFromSamples, typeFromSchema, typeIssues, typeName, typePath, typeText, typed, typesOf, valueOfThing, verifyReads, walk, worldThing };
11894
12090
 
11895
12091
  //# sourceMappingURL=index.js.map