@spakhm/ts-parsec 0.1.3 → 0.1.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.
package/dist/lib.d.ts CHANGED
@@ -19,3 +19,6 @@ 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>;
23
+ export declare const not: <T>(p: parserlike<T>) => parser<null>;
24
+ export declare const peek: <T>(p: parserlike<T>) => parser<T>;
@@ -250,6 +250,27 @@ 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
+ });
256
+ var not = function not(p) {
257
+ return toParser(function (source) {
258
+ var res = toParser(p)(source);
259
+ if (res.type == 'ok') {
260
+ return err(0, 0, "");
261
+ } else {
262
+ return ok(null);
263
+ }
264
+ });
265
+ };
266
+ var peek = function peek(p) {
267
+ return toParser(function (source) {
268
+ source.push();
269
+ var res = toParser(p)(source);
270
+ source.pop_rollback();
271
+ return res;
272
+ });
273
+ };
253
274
 
254
275
  var string_stream = /*#__PURE__*/function () {
255
276
  function string_stream(source, drop_ws) {
@@ -319,7 +340,10 @@ exports.lower = lower;
319
340
  exports.many = many;
320
341
  exports.maybe = maybe;
321
342
  exports.nat = nat;
343
+ exports.noop = noop;
344
+ exports.not = not;
322
345
  exports.ok = ok;
346
+ exports.peek = peek;
323
347
  exports.range = range;
324
348
  exports.sepBy = sepBy;
325
349
  exports.seq = seq;
@@ -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 const not = <T>(p: parserlike<T>) => toParser((source: stream) => {\n const res = toParser(p)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n } else {\n return ok(null);\n }\n});\n\nexport const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {\n source.push();\n const res = toParser(p)(source);\n source.pop_rollback();\n return res;\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","noop","_","not","peek","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})),k=s("a","z"),y=s("A","Z"),m=c(k,y),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=k,exports.many=a,exports.maybe=v,exports.nat=l,exports.noop=g,exports.not=function(e){return n((function(o){return"ok"==n(e)(o).type?t(0,0,""):r(null)}))},exports.ok=r,exports.peek=function(r){return n((function(t){t.push();var e=n(r)(t);return t.pop_rollback(),e}))},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=y,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":"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"}
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 const not = <T>(p: parserlike<T>) => toParser((source: stream) => {\n const res = toParser(p)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n } else {\n return ok(null);\n }\n});\n\nexport const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {\n source.push();\n const res = toParser(p)(source);\n source.pop_rollback();\n return res;\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","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,27 @@ 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
+ });
252
+ var not = function not(p) {
253
+ return toParser(function (source) {
254
+ var res = toParser(p)(source);
255
+ if (res.type == 'ok') {
256
+ return err(0, 0, "");
257
+ } else {
258
+ return ok(null);
259
+ }
260
+ });
261
+ };
262
+ var peek = function peek(p) {
263
+ return toParser(function (source) {
264
+ source.push();
265
+ var res = toParser(p)(source);
266
+ source.pop_rollback();
267
+ return res;
268
+ });
269
+ };
249
270
 
250
271
  var string_stream = /*#__PURE__*/function () {
251
272
  function string_stream(source, drop_ws) {
@@ -298,5 +319,5 @@ var fromString = function fromString(source) {
298
319
  return new string_stream(source);
299
320
  };
300
321
 
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 };
322
+ export { alnum, alpha, attempt, binop, binopr, digit, either, err, fromString, fwd, _int as int, keepWs, lex, lower, many, maybe, nat, noop, not, ok, peek, range, sepBy, seq, some, str, toParser, upper, ws };
302
323
  //# 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 const not = <T>(p: parserlike<T>) => toParser((source: stream) => {\n const res = toParser(p)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n } else {\n return ok(null);\n }\n});\n\nexport const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {\n source.push();\n const res = toParser(p)(source);\n source.pop_rollback();\n return res;\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","noop","_","not","peek","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
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.5","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,21 @@ export function binopr<O, D, N>(
160
160
  return p(source);
161
161
  });
162
162
  }
163
+
164
+ export const noop = toParser((_: stream) => ok(true));
165
+
166
+ export const not = <T>(p: parserlike<T>) => toParser((source: stream) => {
167
+ const res = toParser(p)(source);
168
+ if (res.type == 'ok') {
169
+ return err(0, 0, "");
170
+ } else {
171
+ return ok(null);
172
+ }
173
+ });
174
+
175
+ export const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {
176
+ source.push();
177
+ const res = toParser(p)(source);
178
+ source.pop_rollback();
179
+ return res;
180
+ });