@spakhm/ts-parsec 0.1.4 → 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
@@ -20,3 +20,5 @@ export declare const sepBy: <T, U>(item: parserlike<T>, sep: parserlike<U>, allo
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
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>;
@@ -253,6 +253,24 @@ function binopr(operator, operand, makeNode) {
253
253
  var noop = /*#__PURE__*/toParser(function (_) {
254
254
  return ok(true);
255
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
+ };
256
274
 
257
275
  var string_stream = /*#__PURE__*/function () {
258
276
  function string_stream(source, drop_ws) {
@@ -323,7 +341,9 @@ exports.many = many;
323
341
  exports.maybe = maybe;
324
342
  exports.nat = nat;
325
343
  exports.noop = noop;
344
+ exports.not = not;
326
345
  exports.ok = ok;
346
+ exports.peek = peek;
327
347
  exports.range = range;
328
348
  exports.sepBy = sepBy;
329
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 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
+ {"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=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;
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 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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"}
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":"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,GAkEtBY,EAAO/D,GAAS,SAACgE,GAAS,OAAKvE,GAAG,MCxJzCwE,aAWJ,SAAAA,EAAmB3D,EAAuBU,YAAAA,IAAAA,GAAmB,GAA1CkD,YAAA5D,EAAuB4D,aAAAlD,EAV1CkD,SAAc,EACdA,SAAc,EACdA,SAAc,EAEdA,WAIM,GAE+D,IAAAC,EAAAF,EAAAG,UAmCpE,OAnCoED,EAErExD,KAAA,WACE,GAAIuD,KAAKG,KAAOH,KAAK5D,OAAOI,OAC1B,OAAO,KAET,IAAMQ,EAAKgD,KAAK5D,OAAO4D,KAAKG,OAO5B,OANAH,KAAKpE,MACK,MAANoB,IACFgD,KAAKrE,MACLqE,KAAKpE,IAAM,GAGToE,KAAKlD,SAAyB,KAAdE,EAAGC,OACd+C,KAAKvD,OAELO,GAEViD,EAEDlD,KAAA,WACEiD,KAAKI,MAAMrD,KAAK,CACdpB,IAAKqE,KAAKrE,IAAKC,IAAKoE,KAAKpE,IAAKuE,IAAKH,KAAKG,OAE3CF,EAED9C,aAAA,WACE6C,KAAKI,MAAMC,OACZJ,EAED/C,aAAA,WACE,IAAMuB,EAAIuB,KAAKI,MAAMC,MACrBL,KAAKrE,IAAM8C,EAAE9C,IACbqE,KAAKpE,IAAM6C,EAAE7C,IACboE,KAAKG,IAAM1B,EAAE0B,KACdJ,qEDoEH,SACEO,EACAC,EACAC,GAEA,OAAO1E,GAAS,SAACM,GAMf,OALU6B,EAAIsC,EAAS5B,EAAKV,EAAIqC,EAAUC,KAAWhC,MAAY,SAACkC,EAAMC,GAGtE,OAFYA,EAAOC,QACjB,SAACC,EAAGC,GAAY,OAAML,EAAbK,KAA0BD,EAAnBC,QAAgCJ,KAG7C/D,CAAEN,sBAIb,SACEkE,EACAC,EACAC,GAEA,OAAO1E,GAAS,SAACM,GAcf,OAbU6B,EAAIsC,EAAS5B,EAAKV,EAAIqC,EAAUC,KAAWhC,MAAY,SAACkC,EAAMC,GACtE,GAAsB,IAAlBA,EAAOlE,OAAc,OAAOiE,EAIhC,IADA,IAAIG,EAAaF,EAAOA,EAAOlE,OAAS,GAAG,GAClCD,EAAImE,EAAOlE,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC3C,IAAAuE,EAAoBJ,EAAOnE,GAC3BqE,EAAMJ,EADGM,KAAOA,KACUF,GAG5B,OAAOJ,EAASE,EAAO,GAAG,GAAID,EAAMG,KAG/BlE,CAAEN,yECnGa,SAACA,GACzB,OAAO,IAAI2D,EAAc3D,gBFkCR,SAAI2E,GAA4B,OACjDjF,GAAS,SAACM,GAAc,OAAKN,EAASiF,IAATjF,CAAkBM,4ICqE9B,SAAIM,GAAgB,OAAKZ,GAAS,SAACM,GAEpD,MAAgB,MADJN,EAASY,EAATZ,CAAYM,GAChBX,KACCC,EAAI,EAAG,EAAG,IAEVH,EAAG,oCAIM,SAAImB,GAAgB,OAAKZ,GAAS,SAACM,GACrDA,EAAOW,OACP,IAAMvB,EAAMM,EAASY,EAATZ,CAAYM,GAExB,OADAA,EAAOc,eACA1B,oCA/EY,SAAOwF,EAAqBC,EAAoBC,GAAgC,gBAAhCA,IAAAA,GAA4B,GAC/FpF,GAAS,SAACM,GACR,IAAMZ,EAAW,GAEX8C,EAAOlB,EAAQ4D,EAAR5D,CAAchB,GAC3B,GAAiB,OAAbkC,EAAK7C,KACP,OAAOF,EAAGC,GAKZ,IAHEA,EAAIuB,KAAKuB,EAAK9C,OAGH,CAEX,GAAoB,OADJ4B,EAAQ6D,EAAR7D,CAAahB,GACjBX,KACV,OAAOF,EAAGC,GAGZ,IAAM8C,EAAOlB,EAAQ4D,EAAR5D,CAAchB,GAC3B,GAAiB,OAAbkC,EAAK7C,KACP,OAAOyF,EAAmB3F,EAAGC,GAAOE,EAAI,EAAG,EAAG,IAE9CF,EAAIuB,KAAKuB,EAAK9C"}
@@ -249,6 +249,24 @@ function binopr(operator, operand, makeNode) {
249
249
  var noop = /*#__PURE__*/toParser(function (_) {
250
250
  return ok(true);
251
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
+ };
252
270
 
253
271
  var string_stream = /*#__PURE__*/function () {
254
272
  function string_stream(source, drop_ws) {
@@ -301,5 +319,5 @@ var fromString = function fromString(source) {
301
319
  return new string_stream(source);
302
320
  };
303
321
 
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 };
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 };
305
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 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
+ {"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.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"}}
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
@@ -162,3 +162,19 @@ export function binopr<O, D, N>(
162
162
  }
163
163
 
164
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
+ });