@spakhm/ts-parsec 0.1.3 → 0.1.4

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/dist/lib.d.ts CHANGED
@@ -19,3 +19,4 @@ export declare const alnum: parser<string>;
19
19
  export declare const sepBy: <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep?: boolean) => parser<T[]>;
20
20
  export declare function binop<O, D, N>(operator: parserlike<O>, operand: parserlike<D>, makeNode: (op: O, left: D | N, right: D) => N): parser<N | D>;
21
21
  export declare function binopr<O, D, N>(operator: parserlike<O>, operand: parserlike<D>, makeNode: (op: O, left: D, right: D | N) => N): parser<N | D>;
22
+ export declare const noop: parser<boolean>;
@@ -250,6 +250,9 @@ function binopr(operator, operand, makeNode) {
250
250
  return p(source);
251
251
  });
252
252
  }
253
+ var noop = /*#__PURE__*/toParser(function (_) {
254
+ return ok(true);
255
+ });
253
256
 
254
257
  var string_stream = /*#__PURE__*/function () {
255
258
  function string_stream(source, drop_ws) {
@@ -319,6 +322,7 @@ exports.lower = lower;
319
322
  exports.many = many;
320
323
  exports.maybe = maybe;
321
324
  exports.nat = nat;
325
+ exports.noop = noop;
322
326
  exports.ok = ok;
323
327
  exports.range = range;
324
328
  exports.sepBy = sepBy;
@@ -1 +1 @@
1
- {"version":3,"file":"ts-parsec.cjs.development.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_continue","pop_rollback","fwd","thunk","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","sepBy","item","sep","allowTrailingSep","sepres_","binop","operator","operand","makeNode","left","rights","acc","reduce","_ref","op","right","binopr","_rights$i","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
1
+ {"version":3,"file":"ts-parsec.cjs.development.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n\nexport const noop = toParser((_: stream) => ok(true));\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_continue","pop_rollback","fwd","thunk","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","sepBy","item","sep","allowTrailingSep","sepres_","binop","operator","operand","makeNode","left","rights","acc","reduce","_ref","op","right","binopr","_rights$i","noop","_","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=function(r){return{type:"ok",res:r}},t=function(r,t,n){return{type:"err",err:{row:r,col:t,msg:n}}};function n(t){if("string"==typeof t)return e(t);if("map"in t)return t;var o=t;return o.map=function(t){return n((function(n){var e=o(n);return"ok"==e.type?r(t(e.res)):e}))},o}var e=function(e){return o(n((function(n){for(var o=0;o<e.length;o++)if(n.next()!=e[o])return t(0,0,"");return r(e)})))},o=function(r){return u((function(t){return i(t),n(r)(t)}))},u=function(r){return n((function(t){var e=t.drop_ws;t.drop_ws=!1;var o=n(r)(t);return t.drop_ws=e,o}))},i=n((function(t){for(;;){t.push();var n=t.next();if(""!==(null==n?void 0:n.trim())){t.pop_rollback();break}t.pop_continue()}return r({})})),p=function(r){return n((function(t){t.push();var e=n(r)(t);return"ok"==e.type?t.pop_continue():t.pop_rollback(),e}))},s=function(e,o){return n((function(n){var u=n.next();return u&&u>=e[0]&&u<=o[0]?r(u):t(0,0,"")}))},c=function(){for(var r=arguments.length,e=new Array(r),o=0;o<r;o++)e[o]=arguments[o];return n((function(r){for(var n=0,o=e;n<o.length;n++){var u=p(o[n])(r);if("ok"==u.type)return u}return t(0,0,"")}))},f=function(){for(var e=arguments.length,o=new Array(e),u=0;u<e;u++)o[u]=arguments[u];var i=n((function(e){for(var u=[],i=0,p=o;i<p.length;i++){var s=n(p[i])(e);if("ok"!=s.type)return t(0,0,"");u.push(s.res)}return r(u)}));return i.map2=function(r){return i.map((function(t){return r.apply(void 0,t)}))},i},a=function(t){return n((function(n){for(var e=[];;){var o=p(t)(n);if("ok"!=o.type)break;e.push(o.res)}return r(e)}))},h=function(r){return f(r,a(r)).map2((function(r,t){return[r].concat(t)}))},x=s("0","9"),l=o(h(x)).map((function(r){return parseInt(r.join(""))})),v=function(t){return n((function(n){var e=p(t)(n);return"ok"==e.type?e:r(null)}))},d=f(v(c("-","+")),l).map2((function(r,t){return"-"===r?-t:t})),y=s("a","z"),k=s("A","Z"),m=c(y,k),w=c(m,x),g=function(){function r(r,t){void 0===t&&(t=!0),this.source=r,this.drop_ws=t,this.row=1,this.col=1,this.idx=0,this.stack=[]}var t=r.prototype;return t.next=function(){if(this.idx==this.source.length)return null;var r=this.source[this.idx++];return this.col++,"\n"==r&&(this.row++,this.col=1),this.drop_ws&&""===r.trim()?this.next():r},t.push=function(){this.stack.push({row:this.row,col:this.col,idx:this.idx})},t.pop_continue=function(){this.stack.pop()},t.pop_rollback=function(){var r=this.stack.pop();this.row=r.row,this.col=r.col,this.idx=r.idx},r}();exports.alnum=w,exports.alpha=m,exports.attempt=p,exports.binop=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){return t.reduce((function(r,t){return e(t[0],r,t[1])}),r)}))(n)}))},exports.binopr=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){if(0===t.length)return r;for(var n=t[t.length-1][1],o=t.length-2;o>=0;o--){var u=t[o];n=e(u[0],u[1],n)}return e(t[0][0],r,n)}))(n)}))},exports.digit=x,exports.either=c,exports.err=t,exports.fromString=function(r){return new g(r)},exports.fwd=function(r){return n((function(t){return n(r())(t)}))},exports.int=d,exports.keepWs=u,exports.lex=o,exports.lower=y,exports.many=a,exports.maybe=v,exports.nat=l,exports.ok=r,exports.range=s,exports.sepBy=function(e,o,u){return void 0===u&&(u=!0),n((function(n){var i=[],s=p(e)(n);if("err"==s.type)return r(i);for(i.push(s.res);;){if("err"==p(o)(n).type)return r(i);var c=p(e)(n);if("err"==c.type)return u?r(i):t(0,0,"");i.push(c.res)}}))},exports.seq=f,exports.some=h,exports.str=e,exports.toParser=n,exports.upper=k,exports.ws=i;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=function(r){return{type:"ok",res:r}},t=function(r,t,n){return{type:"err",err:{row:r,col:t,msg:n}}};function n(t){if("string"==typeof t)return e(t);if("map"in t)return t;var o=t;return o.map=function(t){return n((function(n){var e=o(n);return"ok"==e.type?r(t(e.res)):e}))},o}var e=function(e){return o(n((function(n){for(var o=0;o<e.length;o++)if(n.next()!=e[o])return t(0,0,"");return r(e)})))},o=function(r){return u((function(t){return i(t),n(r)(t)}))},u=function(r){return n((function(t){var e=t.drop_ws;t.drop_ws=!1;var o=n(r)(t);return t.drop_ws=e,o}))},i=n((function(t){for(;;){t.push();var n=t.next();if(""!==(null==n?void 0:n.trim())){t.pop_rollback();break}t.pop_continue()}return r({})})),p=function(r){return n((function(t){t.push();var e=n(r)(t);return"ok"==e.type?t.pop_continue():t.pop_rollback(),e}))},s=function(e,o){return n((function(n){var u=n.next();return u&&u>=e[0]&&u<=o[0]?r(u):t(0,0,"")}))},c=function(){for(var r=arguments.length,e=new Array(r),o=0;o<r;o++)e[o]=arguments[o];return n((function(r){for(var n=0,o=e;n<o.length;n++){var u=p(o[n])(r);if("ok"==u.type)return u}return t(0,0,"")}))},f=function(){for(var e=arguments.length,o=new Array(e),u=0;u<e;u++)o[u]=arguments[u];var i=n((function(e){for(var u=[],i=0,p=o;i<p.length;i++){var s=n(p[i])(e);if("ok"!=s.type)return t(0,0,"");u.push(s.res)}return r(u)}));return i.map2=function(r){return i.map((function(t){return r.apply(void 0,t)}))},i},a=function(t){return n((function(n){for(var e=[];;){var o=p(t)(n);if("ok"!=o.type)break;e.push(o.res)}return r(e)}))},h=function(r){return f(r,a(r)).map2((function(r,t){return[r].concat(t)}))},x=s("0","9"),l=o(h(x)).map((function(r){return parseInt(r.join(""))})),v=function(t){return n((function(n){var e=p(t)(n);return"ok"==e.type?e:r(null)}))},d=f(v(c("-","+")),l).map2((function(r,t){return"-"===r?-t:t})),y=s("a","z"),k=s("A","Z"),m=c(y,k),w=c(m,x),g=n((function(t){return r(!0)})),_=function(){function r(r,t){void 0===t&&(t=!0),this.source=r,this.drop_ws=t,this.row=1,this.col=1,this.idx=0,this.stack=[]}var t=r.prototype;return t.next=function(){if(this.idx==this.source.length)return null;var r=this.source[this.idx++];return this.col++,"\n"==r&&(this.row++,this.col=1),this.drop_ws&&""===r.trim()?this.next():r},t.push=function(){this.stack.push({row:this.row,col:this.col,idx:this.idx})},t.pop_continue=function(){this.stack.pop()},t.pop_rollback=function(){var r=this.stack.pop();this.row=r.row,this.col=r.col,this.idx=r.idx},r}();exports.alnum=w,exports.alpha=m,exports.attempt=p,exports.binop=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){return t.reduce((function(r,t){return e(t[0],r,t[1])}),r)}))(n)}))},exports.binopr=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){if(0===t.length)return r;for(var n=t[t.length-1][1],o=t.length-2;o>=0;o--){var u=t[o];n=e(u[0],u[1],n)}return e(t[0][0],r,n)}))(n)}))},exports.digit=x,exports.either=c,exports.err=t,exports.fromString=function(r){return new _(r)},exports.fwd=function(r){return n((function(t){return n(r())(t)}))},exports.int=d,exports.keepWs=u,exports.lex=o,exports.lower=y,exports.many=a,exports.maybe=v,exports.nat=l,exports.noop=g,exports.ok=r,exports.range=s,exports.sepBy=function(e,o,u){return void 0===u&&(u=!0),n((function(n){var i=[],s=p(e)(n);if("err"==s.type)return r(i);for(i.push(s.res);;){if("err"==p(o)(n).type)return r(i);var c=p(e)(n);if("err"==c.type)return u?r(i):t(0,0,"");i.push(c.res)}}))},exports.seq=f,exports.some=h,exports.str=e,exports.toParser=n,exports.upper=k,exports.ws=i;
2
2
  //# sourceMappingURL=ts-parsec.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ts-parsec.cjs.production.min.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_rollback","pop_continue","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","string_stream","this","_proto","prototype","idx","stack","pop","operator","operand","makeNode","left","rights","reduce","acc","_ref","_rights$i","thunk","item","sep","allowTrailingSep"],"mappings":"wEAQaA,EAAK,SAAIC,GAAM,MAAwB,CAAEC,KAAM,KAAMD,IAAAA,IACrDE,EAAM,SAACC,EAAaC,EAAaC,GAAW,MACtD,CAAEJ,KAAM,MAAOC,IAAK,CAAEC,IAAAA,EAAKC,IAAAA,EAAKC,IAAAA,cAgBnBC,EAAaC,GAC3B,GAAiB,iBAANA,EACT,OAAOC,EAAID,GAGb,GAAI,QAASA,EACX,OAAOA,EAGT,IAAME,EAAiBF,EAavB,OAXAE,EAAIC,IAAM,SAAIC,GACZ,OAAOL,GAAS,SAACM,GACf,IAAMZ,EAAMS,EAAIG,GAChB,MAAgB,MAAZZ,EAAIC,KACCF,EAAGY,EAAYX,EAAIA,MAEnBA,MAKNS,MAMID,EAAM,SAAmBK,GAAQ,OAC5CC,EAAIR,GAAS,SAACM,GACZ,IAAK,IAAIG,EAAI,EAAGA,EAAIF,EAAMG,OAAQD,IAChC,GAAGH,EAAOK,QAAUJ,EAAME,GACxB,OAAOb,EAAI,EAAG,EAAG,IAGrB,OAAOH,EAAGc,QAGDC,EAAM,SAAII,GAAgB,OAAKC,GAAO,SAACP,GAElD,OADAQ,EAAGR,GACIN,EAASY,EAATZ,CAAYM,OAGRO,EAAS,SAAID,GAAgB,OACxCZ,GAAS,SAACM,GACR,IAAMS,EAAeT,EAAOU,QAC5BV,EAAOU,SAAU,EACjB,IAAMtB,EAAMM,EAASY,EAATZ,CAAYM,GAExB,OADAA,EAAOU,QAAUD,EACVrB,MAGEoB,EAAKd,GAAS,SAACM,GAC1B,OAAa,CACXA,EAAOW,OACP,IAAMC,EAAKZ,EAAOK,OAClB,GAAmB,YAAfO,SAAAA,EAAIC,QAED,CACLb,EAAOc,eACP,MAHAd,EAAOe,eAMX,OAAO5B,EAAG,OCrFC6B,EAAU,SAAIC,GAAqB,OAC9CvB,GAAS,SAACM,GACRA,EAAOW,OACP,IAAMvB,EAAMM,EAASuB,EAATvB,CAAiBM,GAM7B,MALgB,MAAZZ,EAAIC,KACNW,EAAOe,eAEPf,EAAOc,eAEF1B,MAGE8B,EAAQ,SAACC,EAAeC,GAAW,OAC9C1B,GAAS,SAACM,GACR,IAAMK,EAAOL,EAAOK,OACpB,OAAKA,GACDA,GAAQc,EAAM,IAAMd,GAAQe,EAAI,GAAWjC,EAAGkB,GADhCf,EAAI,EAAG,EAAG,QAKnB+B,EAAS,WAAH,QAAAC,EAAAC,UAAAnB,OAAyBoB,MAA+CC,MAAAH,GAAAI,IAAAA,EAAAJ,EAAAI,IAA/CF,EAA+CE,GAAAH,UAAAG,GAAA,OACzFhC,GAAS,SAACM,GACR,QAAA2B,IAAAC,EAAqBJ,EAAOG,EAAAC,EAAAxB,OAAAuB,IAAE,CAAzB,IACGvC,EAAM4B,EADGY,EAAAD,GACHX,CAAgBhB,GAC5B,GAAgB,MAAZZ,EAAIC,KACN,OAAOD,EAGX,OAAOE,EAAI,EAAG,EAAG,QAORuC,EAAM,sCAAsBL,MAA+CC,MAAAK,GAAAC,IAAAA,EAAAD,EAAAC,IAA/CP,EAA+CO,GAAAR,UAAAQ,GACtF,IAAMzB,EAAIZ,GAAS,SAACM,GAElB,IADA,IAAMZ,EAAiB,GACvB4C,IAAAC,EAAqBT,EAAOQ,EAAAC,EAAA7B,OAAA4B,IAAE,CAAzB,IACGE,EAAOxC,EADEuC,EAAAD,GACFtC,CAAiBM,GAC9B,GAAiB,MAAbkC,EAAK7C,KAGP,OAAOC,EAAI,EAAG,EAAG,IAFjBF,EAAIuB,KAAKuB,EAAK9C,KAKlB,OAAOD,EAAGC,MAIZ,OAFAkB,EAAE6B,KAAO,SAAIC,GAA0B,OACrC9B,EAAER,KAAI,SAAAuC,GAAC,OAAID,EAAEE,aAAID,OACZ/B,GAGIiC,EAAO,SAAItB,GAAqB,OAC3CvB,GAAS,SAACM,GAER,IADA,IAAMZ,EAAW,KACJ,CACX,IAAMoD,EAAOxB,EAAQC,EAARD,CAAgBhB,GAC7B,GAAiB,MAAbwC,EAAKnD,KAGP,MAFAD,EAAIuB,KAAK6B,EAAKpD,KAMlB,OAAOD,EAAGC,OAGDqD,EAAO,SAAIxB,GAAqB,OAC3CY,EAAIZ,EAAQsB,EAAKtB,IAASkB,MAAK,SAACO,EAAIC,GAAE,OAAMD,GAAEE,OAAKD,OAExCE,EAAQ3B,EAAM,IAAK,KAEnB4B,EAAM5C,EAAIuC,EAAKI,IAAQ/C,KAAI,SAACiD,GAAG,OAC1CC,SAASD,EAAIE,KAAK,QAEPC,EAAQ,SAAI5C,GAAgB,OACvCZ,GAAS,SAACM,GACR,IAAMZ,EAAM4B,EAAQV,EAARU,CAAWhB,GACvB,MAAmB,MAAZZ,EAAIC,KAAeD,EAAMD,EAAG,UAG1BgE,EAAMtB,EAAIqB,EAAM7B,EAAO,IAAK,MAAOyB,GAAKX,MAAK,SAACiB,EAAML,GAC/D,MAAa,MAATK,GACML,EAEDA,KAIEM,EAAQnC,EAAM,IAAK,KACnBoC,EAAQpC,EAAM,IAAK,KACnBqC,EAAQlC,EAAOgC,EAAOC,GACtBE,EAAQnC,EAAOkC,EAAOV,GCtF7BY,aAWJ,SAAAA,EAAmBzD,EAAuBU,YAAAA,IAAAA,GAAmB,GAA1CgD,YAAA1D,EAAuB0D,aAAAhD,EAV1CgD,SAAc,EACdA,SAAc,EACdA,SAAc,EAEdA,WAIM,GAE+D,IAAAC,EAAAF,EAAAG,UAmCpE,OAnCoED,EAErEtD,KAAA,WACE,GAAIqD,KAAKG,KAAOH,KAAK1D,OAAOI,OAC1B,OAAO,KAET,IAAMQ,EAAK8C,KAAK1D,OAAO0D,KAAKG,OAO5B,OANAH,KAAKlE,MACK,MAANoB,IACF8C,KAAKnE,MACLmE,KAAKlE,IAAM,GAGTkE,KAAKhD,SAAyB,KAAdE,EAAGC,OACd6C,KAAKrD,OAELO,GAEV+C,EAEDhD,KAAA,WACE+C,KAAKI,MAAMnD,KAAK,CACdpB,IAAKmE,KAAKnE,IAAKC,IAAKkE,KAAKlE,IAAKqE,IAAKH,KAAKG,OAE3CF,EAED5C,aAAA,WACE2C,KAAKI,MAAMC,OACZJ,EAED7C,aAAA,WACE,IAAMuB,EAAIqB,KAAKI,MAAMC,MACrBL,KAAKnE,IAAM8C,EAAE9C,IACbmE,KAAKlE,IAAM6C,EAAE7C,IACbkE,KAAKG,IAAMxB,EAAEwB,KACdJ,qEDoEH,SACEO,EACAC,EACAC,GAEA,OAAOxE,GAAS,SAACM,GAMf,OALU6B,EAAIoC,EAAS1B,EAAKV,EAAImC,EAAUC,KAAW9B,MAAY,SAACgC,EAAMC,GAGtE,OAFYA,EAAOC,QACjB,SAACC,EAAGC,GAAY,OAAML,EAAbK,KAA0BD,EAAnBC,QAAgCJ,KAG7C7D,CAAEN,sBAIb,SACEgE,EACAC,EACAC,GAEA,OAAOxE,GAAS,SAACM,GAcf,OAbU6B,EAAIoC,EAAS1B,EAAKV,EAAImC,EAAUC,KAAW9B,MAAY,SAACgC,EAAMC,GACtE,GAAsB,IAAlBA,EAAOhE,OAAc,OAAO+D,EAIhC,IADA,IAAIG,EAAaF,EAAOA,EAAOhE,OAAS,GAAG,GAClCD,EAAIiE,EAAOhE,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC3C,IAAAqE,EAAoBJ,EAAOjE,GAC3BmE,EAAMJ,EADGM,KAAOA,KACUF,GAG5B,OAAOJ,EAASE,EAAO,GAAG,GAAID,EAAMG,KAG/BhE,CAAEN,yECnGa,SAACA,GACzB,OAAO,IAAIyD,EAAczD,gBFkCR,SAAIyE,GAA4B,OACjD/E,GAAS,SAACM,GAAc,OAAKN,EAAS+E,IAAT/E,CAAkBM,4JCG5B,SAAO0E,EAAqBC,EAAoBC,GAAgC,gBAAhCA,IAAAA,GAA4B,GAC/FlF,GAAS,SAACM,GACR,IAAMZ,EAAW,GAEX8C,EAAOlB,EAAQ0D,EAAR1D,CAAchB,GAC3B,GAAiB,OAAbkC,EAAK7C,KACP,OAAOF,EAAGC,GAKZ,IAHEA,EAAIuB,KAAKuB,EAAK9C,OAGH,CAEX,GAAoB,OADJ4B,EAAQ2D,EAAR3D,CAAahB,GACjBX,KACV,OAAOF,EAAGC,GAGZ,IAAM8C,EAAOlB,EAAQ0D,EAAR1D,CAAchB,GAC3B,GAAiB,OAAbkC,EAAK7C,KACP,OAAOuF,EAAmBzF,EAAGC,GAAOE,EAAI,EAAG,EAAG,IAE9CF,EAAIuB,KAAKuB,EAAK9C"}
1
+ {"version":3,"file":"ts-parsec.cjs.production.min.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n\nexport const noop = toParser((_: stream) => ok(true));\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_rollback","pop_continue","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","noop","_","string_stream","this","_proto","prototype","idx","stack","pop","operator","operand","makeNode","left","rights","reduce","acc","_ref","_rights$i","thunk","item","sep","allowTrailingSep"],"mappings":"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"}
@@ -246,6 +246,9 @@ function binopr(operator, operand, makeNode) {
246
246
  return p(source);
247
247
  });
248
248
  }
249
+ var noop = /*#__PURE__*/toParser(function (_) {
250
+ return ok(true);
251
+ });
249
252
 
250
253
  var string_stream = /*#__PURE__*/function () {
251
254
  function string_stream(source, drop_ws) {
@@ -298,5 +301,5 @@ var fromString = function fromString(source) {
298
301
  return new string_stream(source);
299
302
  };
300
303
 
301
- export { alnum, alpha, attempt, binop, binopr, digit, either, err, fromString, fwd, _int as int, keepWs, lex, lower, many, maybe, nat, ok, range, sepBy, seq, some, str, toParser, upper, ws };
304
+ export { alnum, alpha, attempt, binop, binopr, digit, either, err, fromString, fwd, _int as int, keepWs, lex, lower, many, maybe, nat, noop, ok, range, sepBy, seq, some, str, toParser, upper, ws };
302
305
  //# sourceMappingURL=ts-parsec.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ts-parsec.esm.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_continue","pop_rollback","fwd","thunk","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","sepBy","item","sep","allowTrailingSep","sepres_","binop","operator","operand","makeNode","left","rights","acc","reduce","_ref","op","right","binopr","_rights$i","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
1
+ {"version":3,"file":"ts-parsec.esm.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n\nexport const noop = toParser((_: stream) => ok(true));\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","keepWs","ws","prev_drop_ws","drop_ws","push","ch","trim","pop_continue","pop_rollback","fwd","thunk","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","sepBy","item","sep","allowTrailingSep","sepres_","binop","operator","operand","makeNode","left","rights","acc","reduce","_ref","op","right","binopr","_rights$i","noop","_","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"IAQaA,EAAE,GAAG,SAALA,EAAEA,CAAOC,GAAM;EAAA,OAAwB;IAAEC,IAAI,EAAE,IAAI;IAAED,GAAG,EAAHA;GAAM;AAAA;IAC3DE,GAAG,GAAG,SAANA,GAAGA,CAAIC,GAAW,EAAEC,GAAW,EAAEC,GAAW;EAAA,OACtD;IAAEJ,IAAI,EAAE,KAAK;IAAEC,GAAG,EAAE;MAAEC,GAAG,EAAHA,GAAG;MAAEC,GAAG,EAAHA,GAAG;MAAEC,GAAG,EAAHA;;GAAO;AAAA;SAgB1BC,QAAQA,CAAKC,EAAiB;EAC5C,IAAI,OAAOA,EAAE,IAAI,QAAQ,EAAE;IACzB,OAAOC,GAAG,CAACD,EAAE,CAAC;;EAGhB,IAAI,KAAK,IAAIA,EAAE,EAAE;IACf,OAAOA,EAAE;;EAGX,IAAME,GAAG,GAAcF,EAAe;EAEtCE,GAAG,CAACC,GAAG,GAAG,UAAIC,WAA4B;IACxC,OAAOL,QAAQ,CAAC,UAACM,MAAc;MAC7B,IAAMZ,GAAG,GAAGS,GAAG,CAACG,MAAM,CAAC;MACvB,IAAIZ,GAAG,CAACC,IAAI,IAAI,IAAI,EAAE;QACpB,OAAOF,EAAE,CAACY,WAAW,CAACX,GAAG,CAACA,GAAG,CAAC,CAAC;OAChC,MAAM;QACL,OAAOA,GAAG;;KAEb,CAAC;GACH;EAED,OAAOS,GAAG;AACZ;AAEA;;;IAGaD,GAAG,GAAG,SAANA,GAAGA,CAAsBK,KAAQ;EAAA,OAC5CC,GAAG,CAACR,QAAQ,CAAC,UAACM,MAAc;IAC1B,KAAK,IAAIG,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACG,MAAM,EAAED,CAAC,EAAE,EAAE;MACrC,IAAGH,MAAM,CAACK,IAAI,EAAE,IAAIJ,KAAK,CAACE,CAAC,CAAC,EAAE;QAC5B,OAAOb,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;;IAGxB,OAAOH,EAAE,CAACc,KAAK,CAAC;GACjB,CAAC,CAAC;AAAA;IAEQC,GAAG,GAAG,SAANA,GAAGA,CAAOI,CAAgB;EAAA,OAAKC,MAAM,CAAC,UAACP,MAAc;IAChEQ,EAAE,CAACR,MAAM,CAAC;IACV,OAAON,QAAQ,CAACY,CAAC,CAAC,CAACN,MAAM,CAAC;GAC3B,CAAC;AAAA;IAEWO,MAAM,GAAG,SAATA,MAAMA,CAAOD,CAAgB;EAAA,OACxCZ,QAAQ,CAAC,UAACM,MAAc;IACtB,IAAMS,YAAY,GAAGT,MAAM,CAACU,OAAO;IACnCV,MAAM,CAACU,OAAO,GAAG,KAAK;IACtB,IAAMtB,GAAG,GAAGM,QAAQ,CAACY,CAAC,CAAC,CAACN,MAAM,CAAC;IAC/BA,MAAM,CAACU,OAAO,GAAGD,YAAY;IAC7B,OAAOrB,GAAG;GACX,CAAC;AAAA;IAESoB,EAAE,gBAAGd,QAAQ,CAAC,UAACM,MAAc;EACxC,OAAO,IAAI,EAAE;IACXA,MAAM,CAACW,IAAI,EAAE;IACb,IAAMC,EAAE,GAAGZ,MAAM,CAACK,IAAI,EAAE;IACxB,IAAI,CAAAO,EAAE,oBAAFA,EAAE,CAAEC,IAAI,EAAE,MAAK,EAAE,EAAE;MACrBb,MAAM,CAACc,YAAY,EAAE;KACtB,MAAM;MACLd,MAAM,CAACe,YAAY,EAAE;MACrB;;;EAGJ,OAAO5B,EAAE,CAAC,EAAE,CAAC;AACf,CAAC;AAED;;;IAGa6B,GAAG,GAAG,SAANA,GAAGA,CAAOC,KAA4B;EAAA,OACjDvB,QAAQ,CAAC,UAACM,MAAc;IAAA,OAAKN,QAAQ,CAACuB,KAAK,EAAE,CAAC,CAACjB,MAAM,CAAC;IAAC;AAAA;AAEzD;;;;;;;;IC9FakB,OAAO,GAAG,SAAVA,OAAOA,CAAOC,MAAqB;EAAA,OAC9CzB,QAAQ,CAAC,UAACM,MAAc;IACtBA,MAAM,CAACW,IAAI,EAAE;IACb,IAAMvB,GAAG,GAAGM,QAAQ,CAACyB,MAAM,CAAC,CAACnB,MAAM,CAAC;IACpC,IAAIZ,GAAG,CAACC,IAAI,IAAI,IAAI,EAAE;MACpBW,MAAM,CAACc,YAAY,EAAE;KACtB,MAAM;MACLd,MAAM,CAACe,YAAY,EAAE;;IAEvB,OAAO3B,GAAG;GACX,CAAC;AAAA;AAEJ,IAAagC,KAAK,GAAG,SAARA,KAAKA,CAAIC,KAAa,EAAEC,GAAW;EAAA,OAC9C5B,QAAQ,CAAC,UAACM,MAAc;IACtB,IAAMK,IAAI,GAAGL,MAAM,CAACK,IAAI,EAAE;IAC1B,IAAI,CAACA,IAAI,EAAE,OAAOf,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;IAC/B,IAAIe,IAAI,IAAIgB,KAAK,CAAC,CAAC,CAAC,IAAIhB,IAAI,IAAIiB,GAAG,CAAC,CAAC,CAAC,EAAE,OAAOnC,EAAE,CAACkB,IAAI,CAAC;IACvD,OAAOf,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACrB,CAAC;AAAA;AAEJ,IAAaiC,MAAM,GAAG,SAATA,MAAMA;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAArB,MAAA,EAAyBsB,OAA+C,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;IAA/CF,OAA+C,CAAAE,IAAA,IAAAH,SAAA,CAAAG,IAAA;;EAAA,OACzFlC,QAAQ,CAAC,UAACM,MAAc;IACtB,SAAA6B,EAAA,MAAAC,QAAA,GAAqBJ,OAAO,EAAAG,EAAA,GAAAC,QAAA,CAAA1B,MAAA,EAAAyB,EAAA,IAAE;MAAzB,IAAMV,MAAM,GAAAW,QAAA,CAAAD,EAAA;MACf,IAAMzC,GAAG,GAAG8B,OAAO,CAACC,MAAM,CAAC,CAACnB,MAAM,CAAC;MACnC,IAAIZ,GAAG,CAACC,IAAI,IAAI,IAAI,EAAE;QACpB,OAAOD,GAAG;;;IAGd,OAAOE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;GACrB,CAAC;AAAA;AAMJ,IAAayC,GAAG,GAAG,SAANA,GAAGA;qCAAyBL,OAA+C,OAAAC,KAAA,CAAAK,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;IAA/CP,OAA+C,CAAAO,KAAA,IAAAR,SAAA,CAAAQ,KAAA;;EACtF,IAAM3B,CAAC,GAAGZ,QAAQ,CAAC,UAACM,MAAc;IAChC,IAAMZ,GAAG,GAAc,EAAE;IACzB,SAAA8C,GAAA,MAAAC,SAAA,GAAqBT,OAAO,EAAAQ,GAAA,GAAAC,SAAA,CAAA/B,MAAA,EAAA8B,GAAA,IAAE;MAAzB,IAAMf,MAAM,GAAAgB,SAAA,CAAAD,GAAA;MACf,IAAME,IAAI,GAAG1C,QAAQ,CAACyB,MAAM,CAAC,CAACnB,MAAM,CAAC;MACrC,IAAIoC,IAAI,CAAC/C,IAAI,IAAI,IAAI,EAAE;QACrBD,GAAG,CAACuB,IAAI,CAACyB,IAAI,CAAChD,GAAG,CAAC;OACnB,MAAM;QACL,OAAOE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;;;IAGxB,OAAOH,EAAE,CAACC,GAAU,CAAC;GACtB,CAAmB;EACpBkB,CAAC,CAAC+B,IAAI,GAAG,UAAIC,EAA0B;IAAA,OACrChC,CAAC,CAACR,GAAG,CAAC,UAAAyC,CAAC;MAAA,OAAID,EAAE,CAAAE,KAAA,SAAID,CAAC,CAAC;MAAC;;EACtB,OAAOjC,CAAC;AACV,CAAC;AAED,IAAamC,IAAI,GAAG,SAAPA,IAAIA,CAAOtB,MAAqB;EAAA,OAC3CzB,QAAQ,CAAC,UAACM,MAAc;IACtB,IAAMZ,GAAG,GAAQ,EAAE;IACnB,OAAO,IAAI,EAAE;MACX,IAAMsD,IAAI,GAAGxB,OAAO,CAACC,MAAM,CAAC,CAACnB,MAAM,CAAC;MACpC,IAAI0C,IAAI,CAACrD,IAAI,IAAI,IAAI,EAAE;QACrBD,GAAG,CAACuB,IAAI,CAAC+B,IAAI,CAACtD,GAAG,CAAC;OACnB,MAAM;QACL;;;IAIJ,OAAOD,EAAE,CAACC,GAAG,CAAC;GACf,CAAC;AAAA;AAEJ,IAAauD,IAAI,GAAG,SAAPA,IAAIA,CAAOxB,MAAqB;EAAA,OAC3CY,GAAG,CAACZ,MAAM,EAAEsB,IAAI,CAACtB,MAAM,CAAC,CAAC,CAACkB,IAAI,CAAC,UAACO,EAAE,EAAEC,EAAE;IAAA,QAAMD,EAAE,EAAAE,MAAA,CAAKD,EAAE;GAAC,CAAC;AAAA;AAEzD,IAAaE,KAAK,gBAAG3B,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AAEpC,IAAa4B,GAAG,gBAAG9C,GAAG,CAACyC,IAAI,CAACI,KAAK,CAAC,CAAC,CAACjD,GAAG,CAAC,UAACmD,GAAG;EAAA,OAC1CC,QAAQ,CAACD,GAAG,CAACE,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,EAAC;AAEzB,IAAaC,KAAK,GAAG,SAARA,KAAKA,CAAO9C,CAAgB;EAAA,OACvCZ,QAAQ,CAAC,UAACM,MAAc;IACtB,IAAMZ,GAAG,GAAG8B,OAAO,CAACZ,CAAC,CAAC,CAACN,MAAM,CAAC;IAC9B,OAAOZ,GAAG,CAACC,IAAI,IAAI,IAAI,GAAGD,GAAG,GAAGD,EAAE,CAAC,IAAI,CAAC;GACzC,CAAC;AAAA;AAEG,IAAMkE,IAAG,gBAAGtB,GAAG,CAACqB,KAAK,CAAC7B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EAAEyB,GAAG,CAAC,CAACX,IAAI,CAAC,UAACiB,IAAI,EAAEL,GAAG;EAClE,IAAIK,IAAI,KAAK,GAAG,EAAE;IAChB,OAAO,CAACL,GAAG;GACZ,MAAM;IACL,OAAOA,GAAG;;AAEd,CAAC,CAAC;AAAC,IAEUM,KAAK,gBAAGnC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACpC,IAAaoC,KAAK,gBAAGpC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;AACpC,IAAaqC,KAAK,gBAAGlC,MAAM,CAACgC,KAAK,EAAEC,KAAK,CAAC;AACzC,IAAaE,KAAK,gBAAGnC,MAAM,CAACkC,KAAK,EAAEV,KAAK,CAAC;AAEzC,IAAaY,KAAK,GAAG,SAARA,KAAKA,CAAUC,IAAmB,EAAEC,GAAkB,EAAEC;MAAAA;IAAAA,mBAA4B,IAAI;;EAAA,OACnGpE,QAAQ,CAAC,UAACM,MAAc;IACtB,IAAMZ,GAAG,GAAQ,EAAE;IAEnB,IAAMgD,IAAI,GAAGlB,OAAO,CAAC0C,IAAI,CAAC,CAAC5D,MAAM,CAAC;IAClC,IAAIoC,IAAI,CAAC/C,IAAI,IAAI,KAAK,EAAE;MACtB,OAAOF,EAAE,CAACC,GAAG,CAAC;KACf,MAAM;MACLA,GAAG,CAACuB,IAAI,CAACyB,IAAI,CAAChD,GAAG,CAAC;;IAGpB,OAAO,IAAI,EAAE;MACX,IAAM2E,OAAO,GAAG7C,OAAO,CAAC2C,GAAG,CAAC,CAAC7D,MAAM,CAAC;MACpC,IAAI+D,OAAO,CAAC1E,IAAI,IAAI,KAAK,EAAE;QACzB,OAAOF,EAAE,CAACC,GAAG,CAAC;;MAGhB,IAAMgD,KAAI,GAAGlB,OAAO,CAAC0C,IAAI,CAAC,CAAC5D,MAAM,CAAC;MAClC,IAAIoC,KAAI,CAAC/C,IAAI,IAAI,KAAK,EAAE;QACtB,OAAOyE,gBAAgB,GAAG3E,EAAE,CAACC,GAAG,CAAC,GAAGE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;OAClD,MAAM;QACLF,GAAG,CAACuB,IAAI,CAACyB,KAAI,CAAChD,GAAG,CAAC;;;GAGvB,CAAC;AAAA;AAEJ,SAAgB4E,KAAKA,CACnBC,QAAuB,EACvBC,OAAsB,EACtBC,QAA6C;EAE7C,OAAOzE,QAAQ,CAAC,UAACM,MAAc;IAC7B,IAAMM,CAAC,GAAGyB,GAAG,CAACmC,OAAO,EAAEzB,IAAI,CAACV,GAAG,CAACkC,QAAQ,EAAEC,OAAO,CAAC,CAAC,CAAC,CAAC7B,IAAI,CAAQ,UAAC+B,IAAI,EAAEC,MAAM;MAC5E,IAAMC,GAAG,GAAGD,MAAM,CAACE,MAAM,CACvB,UAACD,GAAG,EAAAE,IAAA;QAAA,IAAGC,EAAE,GAAAD,IAAA;UAAEE,KAAK,GAAAF,IAAA;QAAA,OAAML,QAAQ,CAACM,EAAE,EAAEH,GAAG,EAAEI,KAAK,CAAC;SAAEN,IAAI,CAAC;MACvD,OAAOE,GAAG;KACX,CAAC;IACF,OAAOhE,CAAC,CAACN,MAAM,CAAC;GACjB,CAAC;AACJ;AAEA,SAAgB2E,MAAMA,CACpBV,QAAuB,EACvBC,OAAsB,EACtBC,QAA6C;EAE7C,OAAOzE,QAAQ,CAAC,UAACM,MAAc;IAC7B,IAAMM,CAAC,GAAGyB,GAAG,CAACmC,OAAO,EAAEzB,IAAI,CAACV,GAAG,CAACkC,QAAQ,EAAEC,OAAO,CAAC,CAAC,CAAC,CAAC7B,IAAI,CAAQ,UAAC+B,IAAI,EAAEC,MAAM;MAC5E,IAAIA,MAAM,CAACjE,MAAM,KAAK,CAAC,EAAE,OAAOgE,IAAI;;MAGpC,IAAIE,GAAG,GAAUD,MAAM,CAACA,MAAM,CAACjE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;MAC7C,KAAK,IAAID,CAAC,GAAGkE,MAAM,CAACjE,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;QAC3C,IAAAyE,SAAA,GAAoBP,MAAM,CAAClE,CAAC,CAAC;UAAtBsE,EAAE,GAAAG,SAAA;UAAEF,KAAK,GAAAE,SAAA;QAChBN,GAAG,GAAGH,QAAQ,CAACM,EAAE,EAAEC,KAAK,EAAEJ,GAAG,CAAC;;MAGhC,OAAOH,QAAQ,CAACE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAED,IAAI,EAAEE,GAAG,CAAC;KACzC,CAAC;IAEF,OAAOhE,CAAC,CAACN,MAAM,CAAC;GACjB,CAAC;AACJ;AAEA,IAAa6E,IAAI,gBAAGnF,QAAQ,CAAC,UAACoF,CAAS;EAAA,OAAK3F,EAAE,CAAC,IAAI,CAAC;AAAA,EAAC;;ICxJ/C4F,aAAa;EAWjB,SAAAA,cAAmB/E,MAAc,EAASU;QAAAA;MAAAA,UAAmB,IAAI;;IAA9C,WAAM,GAANV,MAAM;IAAiB,YAAO,GAAPU,OAAO;IAVjD,QAAG,GAAW,CAAC;IACf,QAAG,GAAW,CAAC;IACf,QAAG,GAAW,CAAC;IAEf,UAAK,GAIC,EAAE;;EAE6D,IAAAsE,MAAA,GAAAD,aAAA,CAAAE,SAAA;EAAAD,MAAA,CAErE3E,IAAI,GAAJ,SAAAA,IAAIA;IACF,IAAI,IAAI,CAAC6E,GAAG,IAAI,IAAI,CAAClF,MAAM,CAACI,MAAM,EAAE;MAClC,OAAO,IAAI;;IAEb,IAAMQ,EAAE,GAAG,IAAI,CAACZ,MAAM,CAAC,IAAI,CAACkF,GAAG,EAAE,CAAC;IAClC,IAAI,CAAC1F,GAAG,EAAE;IACV,IAAIoB,EAAE,IAAI,IAAI,EAAE;MACd,IAAI,CAACrB,GAAG,EAAE;MACV,IAAI,CAACC,GAAG,GAAG,CAAC;;IAGd,IAAI,IAAI,CAACkB,OAAO,IAAIE,EAAE,CAACC,IAAI,EAAE,KAAK,EAAE,EAAE;MACpC,OAAO,IAAI,CAACR,IAAI,EAAE;KACnB,MAAM;MACL,OAAOO,EAAE;;GAEZ;EAAAoE,MAAA,CAEDrE,IAAI,GAAJ,SAAAA,IAAIA;IACF,IAAI,CAACwE,KAAK,CAACxE,IAAI,CAAC;MACdpB,GAAG,EAAE,IAAI,CAACA,GAAG;MAAEC,GAAG,EAAE,IAAI,CAACA,GAAG;MAAE0F,GAAG,EAAE,IAAI,CAACA;KACzC,CAAC;GACH;EAAAF,MAAA,CAEDlE,YAAY,GAAZ,SAAAA,YAAYA;IACV,IAAI,CAACqE,KAAK,CAACC,GAAG,EAAE;GACjB;EAAAJ,MAAA,CAEDjE,YAAY,GAAZ,SAAAA,YAAYA;IACV,IAAMwB,CAAC,GAAG,IAAI,CAAC4C,KAAK,CAACC,GAAG,EAAG;IAC3B,IAAI,CAAC7F,GAAG,GAAGgD,CAAC,CAAChD,GAAG;IAChB,IAAI,CAACC,GAAG,GAAG+C,CAAC,CAAC/C,GAAG;IAChB,IAAI,CAAC0F,GAAG,GAAG3C,CAAC,CAAC2C,GAAG;GACjB;EAAA,OAAAH,aAAA;AAAA;AAGH,IAAaM,UAAU,GAAG,SAAbA,UAAUA,CAAIrF,MAAc;EACvC,OAAO,IAAI+E,aAAa,CAAC/E,MAAM,CAAC;AAClC,CAAC;;;;"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"version":"0.1.3","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","files":["dist","src"],"engines":{"node":">=10"},"scripts":{"start":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","prepare":"tsdx build","size":"size-limit","analyze":"size-limit --why"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"prettier":{"printWidth":80,"semi":true,"singleQuote":true,"trailingComma":"es5"},"name":"@spakhm/ts-parsec","author":"Slava Akhmechet","module":"dist/ts-parsec.esm.js","size-limit":[{"path":"dist/ts-parsec.cjs.production.min.js","limit":"10 KB"},{"path":"dist/ts-parsec.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^11.1.6","husky":"^9.1.6","size-limit":"^11.1.6","tsdx":"^0.14.1","tslib":"^2.7.0","typescript":"^3.9.10"}}
1
+ {"version":"0.1.4","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","files":["dist","src"],"engines":{"node":">=10"},"scripts":{"start":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","prepare":"tsdx build","size":"size-limit","analyze":"size-limit --why"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"prettier":{"printWidth":80,"semi":true,"singleQuote":true,"trailingComma":"es5"},"name":"@spakhm/ts-parsec","author":"Slava Akhmechet","module":"dist/ts-parsec.esm.js","size-limit":[{"path":"dist/ts-parsec.cjs.production.min.js","limit":"10 KB"},{"path":"dist/ts-parsec.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^11.1.6","husky":"^9.1.6","size-limit":"^11.1.6","tsdx":"^0.14.1","tslib":"^2.7.0","typescript":"^3.9.10"}}
package/src/lib.ts CHANGED
@@ -160,3 +160,5 @@ export function binopr<O, D, N>(
160
160
  return p(source);
161
161
  });
162
162
  }
163
+
164
+ export const noop = toParser((_: stream) => ok(true));