@enspirit/elo 0.9.4 → 0.9.5

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 (41) hide show
  1. package/README.md +2 -1
  2. package/dist/src/ast.d.ts +29 -6
  3. package/dist/src/ast.d.ts.map +1 -1
  4. package/dist/src/ast.js +14 -3
  5. package/dist/src/ast.js.map +1 -1
  6. package/dist/src/bindings/javascript.d.ts.map +1 -1
  7. package/dist/src/bindings/javascript.js +2 -0
  8. package/dist/src/bindings/javascript.js.map +1 -1
  9. package/dist/src/bindings/ruby.d.ts.map +1 -1
  10. package/dist/src/bindings/ruby.js +13 -2
  11. package/dist/src/bindings/ruby.js.map +1 -1
  12. package/dist/src/bindings/sql.d.ts.map +1 -1
  13. package/dist/src/bindings/sql.js +26 -0
  14. package/dist/src/bindings/sql.js.map +1 -1
  15. package/dist/src/compilers/javascript.d.ts +2 -0
  16. package/dist/src/compilers/javascript.d.ts.map +1 -1
  17. package/dist/src/compilers/javascript.js +38 -10
  18. package/dist/src/compilers/javascript.js.map +1 -1
  19. package/dist/src/compilers/ruby.d.ts +2 -0
  20. package/dist/src/compilers/ruby.d.ts.map +1 -1
  21. package/dist/src/compilers/ruby.js +36 -10
  22. package/dist/src/compilers/ruby.js.map +1 -1
  23. package/dist/src/compilers/sql.js +2 -0
  24. package/dist/src/compilers/sql.js.map +1 -1
  25. package/dist/src/eloc.js +10 -4
  26. package/dist/src/eloc.js.map +1 -1
  27. package/dist/src/ir.d.ts +23 -4
  28. package/dist/src/ir.d.ts.map +1 -1
  29. package/dist/src/ir.js +12 -2
  30. package/dist/src/ir.js.map +1 -1
  31. package/dist/src/parser.d.ts +41 -1
  32. package/dist/src/parser.d.ts.map +1 -1
  33. package/dist/src/parser.js +212 -7
  34. package/dist/src/parser.js.map +1 -1
  35. package/dist/src/runtime.d.ts.map +1 -1
  36. package/dist/src/runtime.js +12 -0
  37. package/dist/src/runtime.js.map +1 -1
  38. package/dist/src/transform.d.ts.map +1 -1
  39. package/dist/src/transform.js +15 -3
  40. package/dist/src/transform.js.map +1 -1
  41. package/package.json +1 -1
package/dist/src/ir.d.ts CHANGED
@@ -12,7 +12,7 @@ import { EloType } from './types';
12
12
  /**
13
13
  * IR expression types
14
14
  */
15
- export type IRExpr = IRIntLiteral | IRFloatLiteral | IRBoolLiteral | IRNullLiteral | IRStringLiteral | IRDateLiteral | IRDateTimeLiteral | IRDurationLiteral | IRObjectLiteral | IRArrayLiteral | IRVariable | IRCall | IRApply | IRLet | IRMemberAccess | IRIf | IRLambda | IRAlternative | IRDataPath | IRTypeDef;
15
+ export type IRExpr = IRIntLiteral | IRFloatLiteral | IRBoolLiteral | IRNullLiteral | IRStringLiteral | IRDateLiteral | IRDateTimeLiteral | IRDurationLiteral | IRObjectLiteral | IRArrayLiteral | IRVariable | IRCall | IRApply | IRLet | IRMemberAccess | IRIf | IRLambda | IRAlternative | IRDataPath | IRTypeDef | IRGuard;
16
16
  /**
17
17
  * Integer literal
18
18
  */
@@ -214,13 +214,20 @@ export interface IRTypeSchema {
214
214
  extras?: 'closed' | 'ignored' | IRTypeExpr;
215
215
  }
216
216
  /**
217
- * Subtype constraint: Int(i | i > 0)
217
+ * A single constraint with optional label (IR version)
218
+ */
219
+ export interface IRConstraint {
220
+ label?: string;
221
+ condition: IRExpr;
222
+ }
223
+ /**
224
+ * Subtype constraint: Int(i | i > 0) or Int(i | positive: i > 0, even: i % 2 == 0)
218
225
  */
219
226
  export interface IRSubtypeConstraint {
220
227
  kind: 'subtype_constraint';
221
228
  baseType: IRTypeExpr;
222
229
  variable: string;
223
- constraint: IRExpr;
230
+ constraints: IRConstraint[];
224
231
  }
225
232
  /**
226
233
  * Array type: [Int]
@@ -254,6 +261,17 @@ export interface IRTypeDef {
254
261
  typeExpr: IRTypeExpr;
255
262
  body: IRExpr;
256
263
  }
264
+ /**
265
+ * Guard expression: guard [label:] condition in body
266
+ * Throws at runtime if condition is false, unless guards are stripped.
267
+ * guardType distinguishes preconditions (guard) from postconditions (check).
268
+ */
269
+ export interface IRGuard {
270
+ type: 'guard';
271
+ constraints: IRConstraint[];
272
+ body: IRExpr;
273
+ guardType: 'guard' | 'check';
274
+ }
257
275
  /**
258
276
  * Factory functions for creating IR nodes
259
277
  */
@@ -278,10 +296,11 @@ export declare function irAlternative(alternatives: IRExpr[], resultType: EloTyp
278
296
  export declare function irDataPath(segments: (string | number)[]): IRDataPath;
279
297
  export declare function irTypeRef(name: string): IRTypeRef;
280
298
  export declare function irTypeSchema(properties: IRTypeSchemaProperty[], extras?: 'closed' | 'ignored' | IRTypeExpr): IRTypeSchema;
281
- export declare function irSubtypeConstraint(baseType: IRTypeExpr, variable: string, constraint: IRExpr): IRSubtypeConstraint;
299
+ export declare function irSubtypeConstraint(baseType: IRTypeExpr, variable: string, constraints: IRConstraint[]): IRSubtypeConstraint;
282
300
  export declare function irArrayType(elementType: IRTypeExpr): IRArrayType;
283
301
  export declare function irUnionType(types: IRTypeExpr[]): IRUnionType;
284
302
  export declare function irTypeDef(name: string, typeExpr: IRTypeExpr, body: IRExpr): IRTypeDef;
303
+ export declare function irGuard(constraints: IRConstraint[], body: IRExpr, guardType?: 'guard' | 'check'): IRGuard;
285
304
  /**
286
305
  * Infer the type of an IR expression
287
306
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ir.d.ts","sourceRoot":"","sources":["../../src/ir.ts"],"names":[],"mappings":"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"}
package/dist/src/ir.js CHANGED
@@ -35,6 +35,7 @@ exports.irSubtypeConstraint = irSubtypeConstraint;
35
35
  exports.irArrayType = irArrayType;
36
36
  exports.irUnionType = irUnionType;
37
37
  exports.irTypeDef = irTypeDef;
38
+ exports.irGuard = irGuard;
38
39
  exports.inferType = inferType;
39
40
  exports.usesInput = usesInput;
40
41
  const types_1 = require("./types");
@@ -104,8 +105,8 @@ function irTypeRef(name) {
104
105
  function irTypeSchema(properties, extras) {
105
106
  return { kind: 'type_schema', properties, extras };
106
107
  }
107
- function irSubtypeConstraint(baseType, variable, constraint) {
108
- return { kind: 'subtype_constraint', baseType, variable, constraint };
108
+ function irSubtypeConstraint(baseType, variable, constraints) {
109
+ return { kind: 'subtype_constraint', baseType, variable, constraints };
109
110
  }
110
111
  function irArrayType(elementType) {
111
112
  return { kind: 'array_type', elementType };
@@ -116,6 +117,9 @@ function irUnionType(types) {
116
117
  function irTypeDef(name, typeExpr, body) {
117
118
  return { type: 'typedef', name, typeExpr, body };
118
119
  }
120
+ function irGuard(constraints, body, guardType = 'guard') {
121
+ return { type: 'guard', constraints, body, guardType };
122
+ }
119
123
  /**
120
124
  * Infer the type of an IR expression
121
125
  */
@@ -161,6 +165,8 @@ function inferType(ir) {
161
165
  return types_1.Types.fn; // DataPath is a function that takes data and returns a value
162
166
  case 'typedef':
163
167
  return inferType(ir.body);
168
+ case 'guard':
169
+ return inferType(ir.body);
164
170
  }
165
171
  }
166
172
  /**
@@ -219,6 +225,10 @@ function usesInput(ir, boundVars = new Set()) {
219
225
  newBound.add(ir.name);
220
226
  return usesInput(ir.body, newBound);
221
227
  }
228
+ case 'guard':
229
+ // Check constraints and body for input usage
230
+ return ir.constraints.some(c => usesInput(c.condition, boundVars)) ||
231
+ usesInput(ir.body, boundVars);
222
232
  }
223
233
  }
224
234
  //# sourceMappingURL=ir.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ir.js","sourceRoot":"","sources":["../../src/ir.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ir.js","sourceRoot":"","sources":["../../src/ir.ts"],"names":[],"mappings":"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"}
@@ -72,10 +72,23 @@ export declare class Parser {
72
72
  */
73
73
  private typeExprPrimary;
74
74
  /**
75
- * Parse a subtype constraint: Int(i | i > 0)
75
+ * Parse a subtype constraint: Int(i | i > 0) or Int(i | positive: i > 0, even: i % 2 == 0)
76
76
  * Called after the base type has been parsed, when we see '('
77
+ * Supports:
78
+ * - Single constraint: Int(i | i > 0)
79
+ * - Labeled constraint: Int(i | positive: i > 0)
80
+ * - Multiple constraints: Int(i | positive: i > 0, even: i % 2 == 0)
81
+ * - String labels: Int(i | 'must be positive': i > 0)
77
82
  */
78
83
  private subtypeConstraintExpr;
84
+ /**
85
+ * Parse a single constraint with optional label
86
+ * Formats:
87
+ * - condition (no label)
88
+ * - identifier: condition
89
+ * - 'string message': condition
90
+ */
91
+ private parseConstraint;
79
92
  /**
80
93
  * Parse a type schema: { name: String, age: Int, nickname :? String, ... } or { name: String, ...: Int }
81
94
  * extras:
@@ -85,6 +98,29 @@ export declare class Parser {
85
98
  */
86
99
  private typeSchemaExpr;
87
100
  private ifExprParse;
101
+ /**
102
+ * Try to parse pipe-style guard: guard(x | condition, ...)
103
+ * Returns a lambda that checks constraints and returns the input value.
104
+ * Returns null if not a pipe-style guard (e.g., regular function call).
105
+ * Called from lowercase identifier parsing (when guard/check used as function name).
106
+ */
107
+ private tryParsePipeGuard;
108
+ /**
109
+ * Try to parse pipe-style guard body after LPAREN has been seen.
110
+ * Called from GUARD/CHECK keyword parsing.
111
+ * Returns null if not a valid pipe-style guard pattern.
112
+ */
113
+ private tryParsePipeGuardBody;
114
+ /**
115
+ * Parse the body of a pipe-style guard after LPAREN has been consumed.
116
+ * Returns null if not a valid pattern, restoring the saved state.
117
+ */
118
+ private parsePipeGuardBody;
119
+ /**
120
+ * Parse guard/check expression: guard [label:] condition[, ...] in body
121
+ * Supports the guard...let...check...in sugar pattern
122
+ */
123
+ private guardExprParse;
88
124
  /**
89
125
  * Parse lambda expression: fn( ~> body ) or fn( x ~> body ) or fn( x, y ~> body )
90
126
  */
@@ -128,6 +164,10 @@ export declare class Parser {
128
164
  */
129
165
  private parsePathSegment;
130
166
  private expr;
167
+ /**
168
+ * Parse guard/check: detect if it's pipe-style guard(x | cond) or block-style guard cond in body
169
+ */
170
+ private guardOrPipeGuard;
131
171
  parse(): Expr;
132
172
  }
133
173
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAiX,MAAM,OAAO,CAAC;AAuf5Y,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAMtD,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,OAAO;IAwJf,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,UAAU;IA4ClB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,WAAW;IAWnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,UAAU;IAWlB;;;;;OAKG;IACH,OAAO,CAAC,IAAI;IA0CZ;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAwC/B;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,OAAO;IAkCf;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA4BnB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA0BlC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAgBhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuCvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAuEtB,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAsCnC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,IAAI;IAiBZ,KAAK,IAAI,IAAI;CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAGtE"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwY,MAAM,OAAO,CAAC;AA+fna,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAS;gBAEb,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;IAMtD,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,OAAO;IA2Kf,OAAO,CAAC,OAAO;IA8Bf,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,KAAK;IAYb,OAAO,CAAC,MAAM;IAqBd,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,UAAU;IA4ClB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,WAAW;IAWnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,UAAU;IAWlB;;;;;OAKG;IACH,OAAO,CAAC,IAAI;IAuDZ;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAwC/B;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,OAAO;IA4Cf;;;;OAIG;IACH,OAAO,CAAC,WAAW;IA4BnB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IA0BlC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAgBhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAuCvB;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAwB7B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IA0CvB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAuEtB,OAAO,CAAC,WAAW;IAUnB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;;OAGG;IACH,OAAO,CAAC,cAAc;IA8BtB;;OAEG;IACH,OAAO,CAAC,WAAW;IA8BnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgCnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAsCnC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,IAAI;IAwBZ;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB,KAAK,IAAI,IAAI;CAKd;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAGtE"}
@@ -274,6 +274,12 @@ class Lexer {
274
274
  if (id === 'fn') {
275
275
  return { type: 'FN', value: id, position: pos, line, column: col };
276
276
  }
277
+ if (id === 'guard') {
278
+ return { type: 'GUARD', value: id, position: pos, line, column: col };
279
+ }
280
+ if (id === 'check') {
281
+ return { type: 'CHECK', value: id, position: pos, line, column: col };
282
+ }
277
283
  // Uppercase identifiers: types, selectors, temporal keywords
278
284
  if (/^[A-Z]/.test(id)) {
279
285
  return { type: 'UPPER_IDENTIFIER', value: id, position: pos, line, column: col };
@@ -483,6 +489,13 @@ class Parser {
483
489
  }
484
490
  // Check if this is a function call
485
491
  if (this.currentToken.type === 'LPAREN') {
492
+ // Special handling for guard/check pipe-style: guard(x | condition)
493
+ if (name === 'guard' || name === 'check') {
494
+ const pipeGuard = this.tryParsePipeGuard(name);
495
+ if (pipeGuard) {
496
+ return pipeGuard;
497
+ }
498
+ }
486
499
  this.eat('LPAREN');
487
500
  const args = [];
488
501
  // Parse arguments
@@ -515,6 +528,15 @@ class Parser {
515
528
  if (token.type === 'IF') {
516
529
  return this.ifExprParse();
517
530
  }
531
+ // Handle guard expressions: guard [label:] condition in body
532
+ // Note: pipe-style guard(x | condition) is handled in expr() via guardOrPipeGuard
533
+ if (token.type === 'GUARD') {
534
+ return this.guardExprParse('guard');
535
+ }
536
+ // Handle check expressions (synonym for guard, for postconditions)
537
+ if (token.type === 'CHECK') {
538
+ return this.guardExprParse('check');
539
+ }
518
540
  // Handle lambda expressions: fn( x | body ) or fn( x, y | body )
519
541
  if (token.type === 'FN') {
520
542
  return this.lambdaParse();
@@ -720,13 +742,25 @@ class Parser {
720
742
  let node = this.logical_or();
721
743
  while (this.currentToken.type === 'PIPE_OP') {
722
744
  this.eat('PIPE_OP');
723
- // Right side must be an identifier (function name) or uppercase (type name)
745
+ // Right side must be an identifier (function name), uppercase (type name), or guard/check
724
746
  const tok = this.currentToken;
725
- if (tok.type !== 'IDENTIFIER' && tok.type !== 'UPPER_IDENTIFIER') {
747
+ if (tok.type !== 'IDENTIFIER' && tok.type !== 'UPPER_IDENTIFIER' &&
748
+ tok.type !== 'GUARD' && tok.type !== 'CHECK') {
726
749
  throw new Error(`Expected function name after |> at ${this.formatLocation(tok)}`);
727
750
  }
728
751
  const funcName = tok.value;
752
+ const isGuardOrCheck = tok.type === 'GUARD' || tok.type === 'CHECK';
729
753
  this.eat(tok.type);
754
+ // For guard/check with pipe-style syntax, parse specially
755
+ if (isGuardOrCheck && this.currentToken.type === 'LPAREN') {
756
+ const guardType = funcName;
757
+ const pipeGuard = this.tryParsePipeGuardBody(guardType);
758
+ if (pipeGuard) {
759
+ // Apply the lambda to the piped value: node |> guard(x | cond) -> pipeGuard(node)
760
+ node = (0, ast_1.apply)(pipeGuard, [node]);
761
+ continue;
762
+ }
763
+ }
730
764
  const args = [node]; // Left side becomes first argument
731
765
  // Parentheses are optional - if present, parse additional arguments
732
766
  const tok2 = this.currentToken;
@@ -834,6 +868,15 @@ class Parser {
834
868
  const value = this.logical_or();
835
869
  bindings.push({ name, value });
836
870
  }
871
+ // Check for let...guard or let...check sugar: let x = ... guard/check condition in body
872
+ if (this.currentToken.type === 'GUARD') {
873
+ const inner = this.guardExprParse('guard');
874
+ return (0, ast_1.letExpr)(bindings, inner);
875
+ }
876
+ if (this.currentToken.type === 'CHECK') {
877
+ const inner = this.guardExprParse('check');
878
+ return (0, ast_1.letExpr)(bindings, inner);
879
+ }
837
880
  this.eat('IN');
838
881
  const body = this.expr(); // Body can be any expression including nested let
839
882
  return (0, ast_1.letExpr)(bindings, body);
@@ -945,8 +988,13 @@ class Parser {
945
988
  return baseType;
946
989
  }
947
990
  /**
948
- * Parse a subtype constraint: Int(i | i > 0)
991
+ * Parse a subtype constraint: Int(i | i > 0) or Int(i | positive: i > 0, even: i % 2 == 0)
949
992
  * Called after the base type has been parsed, when we see '('
993
+ * Supports:
994
+ * - Single constraint: Int(i | i > 0)
995
+ * - Labeled constraint: Int(i | positive: i > 0)
996
+ * - Multiple constraints: Int(i | positive: i > 0, even: i % 2 == 0)
997
+ * - String labels: Int(i | 'must be positive': i > 0)
950
998
  */
951
999
  subtypeConstraintExpr(baseType) {
952
1000
  this.eat('LPAREN');
@@ -955,10 +1003,61 @@ class Parser {
955
1003
  this.eat('IDENTIFIER');
956
1004
  // Expect '|' separator
957
1005
  this.eat('PIPE');
958
- // Parse constraint expression
959
- const constraint = this.expr();
1006
+ // Parse constraints (one or more, comma-separated)
1007
+ const constraints = [];
1008
+ constraints.push(this.parseConstraint());
1009
+ while (this.currentToken.type === 'COMMA') {
1010
+ this.eat('COMMA');
1011
+ constraints.push(this.parseConstraint());
1012
+ }
960
1013
  this.eat('RPAREN');
961
- return (0, ast_1.subtypeConstraint)(baseType, varName, constraint);
1014
+ return (0, ast_1.subtypeConstraint)(baseType, varName, constraints);
1015
+ }
1016
+ /**
1017
+ * Parse a single constraint with optional label
1018
+ * Formats:
1019
+ * - condition (no label)
1020
+ * - identifier: condition
1021
+ * - 'string message': condition
1022
+ */
1023
+ parseConstraint() {
1024
+ // Check for label (identifier or string followed by colon)
1025
+ let label;
1026
+ if (this.currentToken.type === 'IDENTIFIER') {
1027
+ // Could be a label or the start of the condition
1028
+ // Look ahead: if next is COLON, it's a label
1029
+ const savedState = this.saveState();
1030
+ const potentialLabel = this.currentToken.value;
1031
+ this.eat('IDENTIFIER');
1032
+ if (this.currentToken.type === 'COLON') {
1033
+ // It's a label
1034
+ this.eat('COLON');
1035
+ label = potentialLabel;
1036
+ }
1037
+ else {
1038
+ // Not a label, restore and parse as expression
1039
+ this.restoreState(savedState);
1040
+ }
1041
+ }
1042
+ else if (this.currentToken.type === 'STRING') {
1043
+ // String label
1044
+ const savedState = this.saveState();
1045
+ const potentialLabel = this.currentToken.value;
1046
+ this.eat('STRING');
1047
+ if (this.currentToken.type === 'COLON') {
1048
+ // It's a label
1049
+ this.eat('COLON');
1050
+ label = potentialLabel;
1051
+ }
1052
+ else {
1053
+ // Not a label, restore and parse as expression
1054
+ this.restoreState(savedState);
1055
+ }
1056
+ }
1057
+ // Parse the constraint condition
1058
+ // Use logical_or to avoid consuming COMMA and RPAREN which delimit constraints
1059
+ const condition = this.logical_or();
1060
+ return { label, condition };
962
1061
  }
963
1062
  /**
964
1063
  * Parse a type schema: { name: String, age: Int, nickname :? String, ... } or { name: String, ...: Int }
@@ -1041,6 +1140,88 @@ class Parser {
1041
1140
  const elseBranch = this.expr();
1042
1141
  return (0, ast_1.ifExpr)(condition, thenBranch, elseBranch);
1043
1142
  }
1143
+ /**
1144
+ * Try to parse pipe-style guard: guard(x | condition, ...)
1145
+ * Returns a lambda that checks constraints and returns the input value.
1146
+ * Returns null if not a pipe-style guard (e.g., regular function call).
1147
+ * Called from lowercase identifier parsing (when guard/check used as function name).
1148
+ */
1149
+ tryParsePipeGuard(guardType) {
1150
+ const savedState = this.saveState();
1151
+ this.eat('LPAREN');
1152
+ return this.parsePipeGuardBody(guardType, savedState);
1153
+ }
1154
+ /**
1155
+ * Try to parse pipe-style guard body after LPAREN has been seen.
1156
+ * Called from GUARD/CHECK keyword parsing.
1157
+ * Returns null if not a valid pipe-style guard pattern.
1158
+ */
1159
+ tryParsePipeGuardBody(guardType) {
1160
+ const savedState = this.saveState();
1161
+ this.eat('LPAREN');
1162
+ return this.parsePipeGuardBody(guardType, savedState);
1163
+ }
1164
+ /**
1165
+ * Parse the body of a pipe-style guard after LPAREN has been consumed.
1166
+ * Returns null if not a valid pattern, restoring the saved state.
1167
+ */
1168
+ parsePipeGuardBody(guardType, savedState) {
1169
+ // Check for IDENTIFIER PIPE pattern
1170
+ if (this.currentToken.type !== 'IDENTIFIER') {
1171
+ this.restoreState(savedState);
1172
+ return null;
1173
+ }
1174
+ const varName = this.currentToken.value;
1175
+ this.eat('IDENTIFIER');
1176
+ if (this.currentToken.type !== 'PIPE') {
1177
+ this.restoreState(savedState);
1178
+ return null;
1179
+ }
1180
+ this.eat('PIPE');
1181
+ // Parse constraints (one or more, comma-separated) - reuse constraint parsing
1182
+ const constraints = [];
1183
+ constraints.push(this.parseConstraint());
1184
+ while (this.currentToken.type === 'COMMA') {
1185
+ this.eat('COMMA');
1186
+ constraints.push(this.parseConstraint());
1187
+ }
1188
+ this.eat('RPAREN');
1189
+ // Create a lambda: fn(x ~> guard constraints in x)
1190
+ // The guard body is just the variable itself (returns input if guard passes)
1191
+ const varRef = (0, ast_1.variable)(varName);
1192
+ const guardBody = (0, ast_1.guardExpr)(constraints, varRef, guardType);
1193
+ return (0, ast_1.lambda)([varName], guardBody);
1194
+ }
1195
+ /**
1196
+ * Parse guard/check expression: guard [label:] condition[, ...] in body
1197
+ * Supports the guard...let...check...in sugar pattern
1198
+ */
1199
+ guardExprParse(guardType) {
1200
+ this.eat(guardType === 'guard' ? 'GUARD' : 'CHECK');
1201
+ // Parse constraints (one or more, comma-separated)
1202
+ const constraints = [];
1203
+ constraints.push(this.parseConstraint());
1204
+ while (this.currentToken.type === 'COMMA') {
1205
+ this.eat('COMMA');
1206
+ constraints.push(this.parseConstraint());
1207
+ }
1208
+ // Check for guard...check sugar
1209
+ // guard cond check cond in body
1210
+ const tok = this.currentToken;
1211
+ if (tok.type === 'GUARD' && guardType === 'guard') {
1212
+ // guard...guard sugar (nested guards)
1213
+ const inner = this.guardExprParse('guard');
1214
+ return (0, ast_1.guardExpr)(constraints, inner, guardType);
1215
+ }
1216
+ else if (tok.type === 'CHECK') {
1217
+ // guard...check sugar: guard cond check cond in body
1218
+ const inner = this.guardExprParse('check');
1219
+ return (0, ast_1.guardExpr)(constraints, inner, guardType);
1220
+ }
1221
+ this.eat('IN');
1222
+ const body = this.expr();
1223
+ return (0, ast_1.guardExpr)(constraints, body, guardType);
1224
+ }
1044
1225
  /**
1045
1226
  * Parse lambda expression: fn( ~> body ) or fn( x ~> body ) or fn( x, y ~> body )
1046
1227
  */
@@ -1236,19 +1417,43 @@ class Parser {
1236
1417
  this.depth++;
1237
1418
  this.checkDepth();
1238
1419
  try {
1239
- // Let and if expressions have lowest precedence
1420
+ // Let, if, guard, check expressions have lowest precedence
1240
1421
  if (this.currentToken.type === 'LET') {
1241
1422
  return this.letExpr();
1242
1423
  }
1243
1424
  if (this.currentToken.type === 'IF') {
1244
1425
  return this.ifExprParse();
1245
1426
  }
1427
+ // Handle guard/check: either block-style or pipe-style
1428
+ if (this.currentToken.type === 'GUARD') {
1429
+ return this.guardOrPipeGuard('guard');
1430
+ }
1431
+ if (this.currentToken.type === 'CHECK') {
1432
+ return this.guardOrPipeGuard('check');
1433
+ }
1246
1434
  return this.pipe();
1247
1435
  }
1248
1436
  finally {
1249
1437
  this.depth--;
1250
1438
  }
1251
1439
  }
1440
+ /**
1441
+ * Parse guard/check: detect if it's pipe-style guard(x | cond) or block-style guard cond in body
1442
+ */
1443
+ guardOrPipeGuard(guardType) {
1444
+ const savedState = this.saveState();
1445
+ this.eat(guardType === 'guard' ? 'GUARD' : 'CHECK');
1446
+ // Check for pipe-style: guard(x | condition)
1447
+ if (this.currentToken.type === 'LPAREN') {
1448
+ const pipeGuard = this.tryParsePipeGuardBody(guardType);
1449
+ if (pipeGuard) {
1450
+ return pipeGuard;
1451
+ }
1452
+ }
1453
+ // Not pipe-style, restore and parse as block-style
1454
+ this.restoreState(savedState);
1455
+ return this.guardExprParse(guardType);
1456
+ }
1252
1457
  parse() {
1253
1458
  const result = this.expr();
1254
1459
  this.eat('EOF');