@thomasfosterau/effect-parse 0.5.0 → 0.6.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.
Files changed (99) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/README.md +19 -1
  3. package/dist/Ascii.d.ts.map +1 -1
  4. package/dist/Ascii.js +5 -3
  5. package/dist/Ascii.js.map +1 -1
  6. package/dist/Binary.d.ts +5 -2
  7. package/dist/Binary.d.ts.map +1 -1
  8. package/dist/Binary.js +20 -3
  9. package/dist/Binary.js.map +1 -1
  10. package/dist/Bits.d.ts.map +1 -1
  11. package/dist/Bits.js +4 -0
  12. package/dist/Bits.js.map +1 -1
  13. package/dist/Input.d.ts +21 -3
  14. package/dist/Input.d.ts.map +1 -1
  15. package/dist/Input.js +31 -4
  16. package/dist/Input.js.map +1 -1
  17. package/dist/Nom.d.ts.map +1 -1
  18. package/dist/ParseError.d.ts +69 -11
  19. package/dist/ParseError.d.ts.map +1 -1
  20. package/dist/ParseError.js +129 -28
  21. package/dist/ParseError.js.map +1 -1
  22. package/dist/Parser.d.ts +10 -4
  23. package/dist/Parser.d.ts.map +1 -1
  24. package/dist/Parser.js +10 -24
  25. package/dist/Parser.js.map +1 -1
  26. package/dist/ParserSchema.d.ts.map +1 -1
  27. package/dist/ParserSchema.js +1 -2
  28. package/dist/ParserSchema.js.map +1 -1
  29. package/dist/ParserStream.d.ts +119 -12
  30. package/dist/ParserStream.d.ts.map +1 -1
  31. package/dist/ParserStream.js +282 -55
  32. package/dist/ParserStream.js.map +1 -1
  33. package/dist/Syntax.js +1 -1
  34. package/dist/Text.d.ts.map +1 -1
  35. package/dist/Text.js +13 -7
  36. package/dist/Text.js.map +1 -1
  37. package/dist/Token.d.ts +10 -1
  38. package/dist/Token.d.ts.map +1 -1
  39. package/dist/Token.js +14 -5
  40. package/dist/Token.js.map +1 -1
  41. package/dist/internal/compiler/closure.d.ts +1 -1
  42. package/dist/internal/compiler/closure.d.ts.map +1 -1
  43. package/dist/internal/compiler/closure.js +7 -17
  44. package/dist/internal/compiler/closure.js.map +1 -1
  45. package/dist/internal/compiler/first.d.ts.map +1 -1
  46. package/dist/internal/compiler/first.js +2 -1
  47. package/dist/internal/compiler/first.js.map +1 -1
  48. package/dist/internal/compiler/graph.d.ts +23 -1
  49. package/dist/internal/compiler/graph.d.ts.map +1 -1
  50. package/dist/internal/compiler/graph.js +27 -5
  51. package/dist/internal/compiler/graph.js.map +1 -1
  52. package/dist/internal/compiler/jit.d.ts.map +1 -1
  53. package/dist/internal/compiler/jit.js +26 -13
  54. package/dist/internal/compiler/jit.js.map +1 -1
  55. package/dist/internal/compiler/registry.d.ts +1 -1
  56. package/dist/internal/compiler/wasm.d.ts.map +1 -1
  57. package/dist/internal/compiler/wasm.js +105 -34
  58. package/dist/internal/compiler/wasm.js.map +1 -1
  59. package/dist/internal/node.d.ts +19 -1
  60. package/dist/internal/node.d.ts.map +1 -1
  61. package/dist/internal/node.js +42 -8
  62. package/dist/internal/node.js.map +1 -1
  63. package/dist/internal/run.d.ts +3 -1
  64. package/dist/internal/run.d.ts.map +1 -1
  65. package/dist/internal/run.js +4 -2
  66. package/dist/internal/run.js.map +1 -1
  67. package/dist/internal/stack.d.ts +8 -0
  68. package/dist/internal/stack.d.ts.map +1 -1
  69. package/dist/internal/stack.js +17 -1
  70. package/dist/internal/stack.js.map +1 -1
  71. package/dist/internal/tokens.d.ts +10 -3
  72. package/dist/internal/tokens.d.ts.map +1 -1
  73. package/dist/internal/tokens.js +22 -9
  74. package/dist/internal/tokens.js.map +1 -1
  75. package/dist/internal/tuple.d.ts +6 -0
  76. package/dist/internal/tuple.d.ts.map +1 -0
  77. package/dist/internal/tuple.js +170 -0
  78. package/dist/internal/tuple.js.map +1 -0
  79. package/package.json +17 -10
  80. package/src/Ascii.ts +5 -3
  81. package/src/Binary.ts +24 -3
  82. package/src/Bits.ts +4 -0
  83. package/src/Input.ts +37 -4
  84. package/src/ParseError.ts +206 -52
  85. package/src/Parser.ts +19 -29
  86. package/src/ParserSchema.ts +1 -2
  87. package/src/ParserStream.ts +336 -62
  88. package/src/Text.ts +16 -12
  89. package/src/Token.ts +14 -5
  90. package/src/internal/compiler/closure.ts +9 -18
  91. package/src/internal/compiler/first.ts +6 -0
  92. package/src/internal/compiler/graph.ts +32 -4
  93. package/src/internal/compiler/jit.ts +37 -17
  94. package/src/internal/compiler/wasm.ts +141 -68
  95. package/src/internal/node.ts +49 -3
  96. package/src/internal/run.ts +4 -2
  97. package/src/internal/stack.ts +17 -0
  98. package/src/internal/tokens.ts +20 -10
  99. package/src/internal/tuple.ts +141 -0
package/dist/Parser.js CHANGED
@@ -2,6 +2,7 @@ import * as Predicate from "effect/Predicate";
2
2
  import * as Result from "effect/Result";
3
3
  import { Fail, Failure, State, mergeExpected, mergeFailures, mergeTiedFailures } from "./Input.js";
4
4
  import { Key } from "./internal/key.js";
5
+ import { Defer as Defer$1, NodeId, bounds, describedNode } from "./internal/node.js";
5
6
  import * as Resume from "./internal/resume.js";
6
7
  import * as Registry from "./internal/compiler/registry.js";
7
8
  import * as Run from "./internal/run.js";
@@ -17,7 +18,7 @@ import { pipeArguments } from "effect/Pipeable";
17
18
  import * as ParseError from "./ParseError.js";
18
19
  import * as Entries from "./internal/entries.js";
19
20
  import * as Stack from "./internal/stack.js";
20
- import { Defer as Defer$1, NodeId, bounds, describedNode } from "./internal/node.js";
21
+ import { tupleStep } from "./internal/tuple.js";
21
22
  // src/Parser.ts
22
23
  /**
23
24
  * The `Parser` data type and its general-purpose combinators.
@@ -1282,17 +1283,8 @@ const allConsuming = (self) => terminated(self, eof);
1282
1283
  * @category sequencing
1283
1284
  */
1284
1285
  const seq = (...parsers) => {
1285
- const steps = parsers.map((p) => p.step);
1286
- const n = steps.length;
1287
- return described((state) => {
1288
- const out = new Array(n);
1289
- for (let i = 0; i < n; i++) {
1290
- const a = steps[i](state);
1291
- if (a === Fail) return Fail;
1292
- out[i] = a;
1293
- }
1294
- return out;
1295
- }, "seq", {
1286
+ const step = tupleStep(parsers.map((p) => p.step));
1287
+ return described(step, "seq", {
1296
1288
  _tag: "Seq",
1297
1289
  parsers,
1298
1290
  output: "tuple"
@@ -1735,11 +1727,7 @@ const permutation = (...parsers) => {
1735
1727
  }, "permutation");
1736
1728
  };
1737
1729
  const normalizeRange = (range) => {
1738
- if (range === void 0) return [0, Infinity];
1739
- if (Predicate.isNumber(range)) return [range, range];
1740
- const min = range.min ?? 0;
1741
- const max = range.max ?? Infinity;
1742
- if (min > max) throw new RangeError(`invalid range: min (${min}) > max (${max})`);
1730
+ const { max, min } = bounds(range);
1743
1731
  return [min, max];
1744
1732
  };
1745
1733
  const assertConsumes = (state, name) => state.failMessage("Cut", "Assert", `\`${name}\` parsers must always consume`);
@@ -1751,7 +1739,6 @@ const saveFold = (state, key, entry, acc, pos) => Resume.save(state, key, entry,
1751
1739
  const foldImpl = (self, range, init, f, name, node, cond) => {
1752
1740
  const [min, max] = normalizeRange(range);
1753
1741
  const step = self.step;
1754
- const checkLoop = max === Infinity;
1755
1742
  const key = new Key();
1756
1743
  return described((state) => {
1757
1744
  const entry = state.pos;
@@ -1781,7 +1768,7 @@ const foldImpl = (self, range, init, f, name, node, cond) => {
1781
1768
  recover(state, start);
1782
1769
  return Resume.done(state, key, entry, resumed !== void 0, acc);
1783
1770
  }
1784
- if (checkLoop && state.pos === start) return assertConsumes(state, name);
1771
+ if (state.pos === start) return assertConsumes(state, name);
1785
1772
  acc = f(acc, a);
1786
1773
  }
1787
1774
  return Resume.done(state, key, entry, resumed !== void 0, acc);
@@ -1803,9 +1790,9 @@ const foldImpl = (self, range, init, f, name, node, cond) => {
1803
1790
  * exactly that many times. With a literal positive `min`, the output is
1804
1791
  * typed as a non-empty array.
1805
1792
  *
1806
- * As in winnow, an unbounded repetition of a parser that succeeds without
1807
- * consuming input fails with an unrecoverable assertion instead of looping
1808
- * forever.
1793
+ * A parser that succeeds without consuming input fails the repetition with
1794
+ * an unrecoverable `Assert` failure, whatever the range (winnow checks only
1795
+ * unbounded ones): a bound can come from the input (`Binary.lengthRepeat`).
1809
1796
  *
1810
1797
  * @example
1811
1798
  * ```ts
@@ -1913,7 +1900,6 @@ const separated = /*#__PURE__*/ dual(isTwoParserArgs, (self, separator, range) =
1913
1900
  const [min, max] = normalizeRange(range);
1914
1901
  const step = self.step;
1915
1902
  const sepStep = separator.step;
1916
- const checkLoop = max === Infinity;
1917
1903
  const key = new Key();
1918
1904
  return described((state) => {
1919
1905
  const entry = state.pos;
@@ -1949,7 +1935,7 @@ const separated = /*#__PURE__*/ dual(isTwoParserArgs, (self, separator, range) =
1949
1935
  recover(state, start);
1950
1936
  return Resume.done(state, key, entry, resumed !== void 0, acc);
1951
1937
  }
1952
- if (checkLoop && state.pos === start) return assertConsumes(state, "separated");
1938
+ if (state.pos === start) return assertConsumes(state, "separated");
1953
1939
  const a = step(state);
1954
1940
  if (a === Fail) {
1955
1941
  if (state.mode === "Incomplete" && state.resume !== void 0) Resume.save(state, key, entry, {