securemark 0.295.1 → 0.295.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/design.md +4 -3
  3. package/dist/index.js +514 -459
  4. package/markdown.d.ts +13 -28
  5. package/package.json +1 -1
  6. package/src/combinator/control/constraint/block.test.ts +6 -8
  7. package/src/combinator/control/constraint/contract.ts +7 -7
  8. package/src/combinator/control/constraint/line.test.ts +7 -9
  9. package/src/combinator/control/constraint/line.ts +0 -1
  10. package/src/combinator/control/manipulation/clear.ts +2 -2
  11. package/src/combinator/control/manipulation/convert.ts +3 -3
  12. package/src/combinator/control/manipulation/duplicate.ts +4 -4
  13. package/src/combinator/control/manipulation/fallback.ts +2 -2
  14. package/src/combinator/control/manipulation/fence.ts +3 -3
  15. package/src/combinator/control/manipulation/indent.test.ts +20 -22
  16. package/src/combinator/control/manipulation/indent.ts +2 -2
  17. package/src/combinator/control/manipulation/recovery.ts +3 -3
  18. package/src/combinator/control/manipulation/reverse.ts +2 -2
  19. package/src/combinator/control/manipulation/scope.ts +2 -4
  20. package/src/combinator/control/manipulation/surround.ts +32 -32
  21. package/src/combinator/control/monad/bind.ts +6 -6
  22. package/src/combinator/control/monad/fmap.ts +6 -6
  23. package/src/combinator/data/data.ts +2 -2
  24. package/src/combinator/data/{parser/context/delimiter.ts → delimiter.ts} +4 -4
  25. package/src/combinator/data/parser/context.test.ts +12 -11
  26. package/src/combinator/data/parser/context.ts +13 -14
  27. package/src/combinator/data/parser/inits.ts +5 -5
  28. package/src/combinator/data/parser/sequence.test.ts +12 -13
  29. package/src/combinator/data/parser/sequence.ts +5 -5
  30. package/src/combinator/data/parser/some.test.ts +15 -16
  31. package/src/combinator/data/parser/some.ts +5 -6
  32. package/src/combinator/data/parser/subsequence.test.ts +16 -17
  33. package/src/combinator/data/parser/subsequence.ts +3 -3
  34. package/src/combinator/data/parser/tails.ts +3 -3
  35. package/src/combinator/data/parser/union.test.ts +12 -13
  36. package/src/combinator/data/parser/union.ts +3 -3
  37. package/src/combinator/data/parser.ts +55 -32
  38. package/src/debug.test.ts +5 -3
  39. package/src/parser/api/bind.ts +8 -6
  40. package/src/parser/api/header.ts +4 -4
  41. package/src/parser/api/normalize.ts +2 -1
  42. package/src/parser/api/parse.test.ts +7 -6
  43. package/src/parser/api/parse.ts +9 -8
  44. package/src/parser/autolink.test.ts +18 -18
  45. package/src/parser/block/blockquote.test.ts +79 -79
  46. package/src/parser/block/blockquote.ts +5 -5
  47. package/src/parser/block/codeblock.test.ts +57 -57
  48. package/src/parser/block/codeblock.ts +3 -3
  49. package/src/parser/block/dlist.test.ts +57 -57
  50. package/src/parser/block/dlist.ts +6 -6
  51. package/src/parser/block/extension/aside.test.ts +9 -9
  52. package/src/parser/block/extension/aside.ts +5 -5
  53. package/src/parser/block/extension/example.test.ts +19 -19
  54. package/src/parser/block/extension/example.ts +6 -6
  55. package/src/parser/block/extension/fig.test.ts +36 -36
  56. package/src/parser/block/extension/figbase.test.ts +16 -16
  57. package/src/parser/block/extension/figbase.ts +2 -2
  58. package/src/parser/block/extension/figure.test.ts +63 -63
  59. package/src/parser/block/extension/figure.ts +3 -3
  60. package/src/parser/block/extension/message.test.ts +14 -14
  61. package/src/parser/block/extension/message.ts +5 -5
  62. package/src/parser/block/extension/placeholder.test.ts +13 -13
  63. package/src/parser/block/extension/placeholder.ts +2 -2
  64. package/src/parser/block/extension/table.test.ts +76 -76
  65. package/src/parser/block/extension/table.ts +14 -14
  66. package/src/parser/block/extension.test.ts +24 -24
  67. package/src/parser/block/heading.test.ts +59 -59
  68. package/src/parser/block/heading.ts +7 -7
  69. package/src/parser/block/ilist.test.ts +8 -12
  70. package/src/parser/block/ilist.ts +6 -6
  71. package/src/parser/block/mathblock.test.ts +32 -32
  72. package/src/parser/block/mathblock.ts +3 -3
  73. package/src/parser/block/mediablock.ts +3 -3
  74. package/src/parser/block/olist.test.ts +103 -103
  75. package/src/parser/block/olist.ts +5 -5
  76. package/src/parser/block/pagebreak.test.ts +16 -16
  77. package/src/parser/block/pagebreak.ts +2 -2
  78. package/src/parser/block/paragraph.test.ts +58 -58
  79. package/src/parser/block/paragraph.ts +2 -2
  80. package/src/parser/block/reply/cite.test.ts +40 -40
  81. package/src/parser/block/reply/cite.ts +6 -6
  82. package/src/parser/block/reply/quote.test.ts +51 -51
  83. package/src/parser/block/reply/quote.ts +3 -3
  84. package/src/parser/block/reply.test.ts +20 -20
  85. package/src/parser/block/reply.ts +3 -3
  86. package/src/parser/block/sidefence.test.ts +48 -48
  87. package/src/parser/block/sidefence.ts +4 -4
  88. package/src/parser/block/table.test.ts +50 -50
  89. package/src/parser/block/table.ts +12 -12
  90. package/src/parser/block/ulist.test.ts +53 -53
  91. package/src/parser/block/ulist.ts +6 -6
  92. package/src/parser/block.ts +6 -4
  93. package/src/parser/context.ts +39 -0
  94. package/src/parser/header.test.ts +23 -23
  95. package/src/parser/header.ts +5 -5
  96. package/src/parser/inline/annotation.test.ts +43 -43
  97. package/src/parser/inline/annotation.ts +14 -4
  98. package/src/parser/inline/autolink/account.test.ts +33 -33
  99. package/src/parser/inline/autolink/account.ts +9 -9
  100. package/src/parser/inline/autolink/anchor.test.ts +22 -22
  101. package/src/parser/inline/autolink/anchor.ts +4 -4
  102. package/src/parser/inline/autolink/channel.test.ts +15 -15
  103. package/src/parser/inline/autolink/email.test.ts +37 -37
  104. package/src/parser/inline/autolink/email.ts +2 -2
  105. package/src/parser/inline/autolink/hashnum.test.ts +33 -33
  106. package/src/parser/inline/autolink/hashnum.ts +6 -5
  107. package/src/parser/inline/autolink/hashtag.test.ts +60 -60
  108. package/src/parser/inline/autolink/hashtag.ts +4 -4
  109. package/src/parser/inline/autolink/url.test.ts +75 -75
  110. package/src/parser/inline/autolink/url.ts +4 -4
  111. package/src/parser/inline/bracket.test.ts +70 -70
  112. package/src/parser/inline/bracket.ts +35 -32
  113. package/src/parser/inline/code.test.ts +31 -31
  114. package/src/parser/inline/code.ts +4 -4
  115. package/src/parser/inline/deletion.test.ts +28 -28
  116. package/src/parser/inline/deletion.ts +4 -4
  117. package/src/parser/inline/emphasis.test.ts +40 -40
  118. package/src/parser/inline/emphasis.ts +3 -3
  119. package/src/parser/inline/emstrong.test.ts +101 -101
  120. package/src/parser/inline/emstrong.ts +23 -23
  121. package/src/parser/inline/extension/index.test.ts +92 -92
  122. package/src/parser/inline/extension/index.ts +5 -5
  123. package/src/parser/inline/extension/indexee.ts +5 -5
  124. package/src/parser/inline/extension/indexer.test.ts +24 -24
  125. package/src/parser/inline/extension/indexer.ts +2 -2
  126. package/src/parser/inline/extension/label.test.ts +33 -33
  127. package/src/parser/inline/extension/label.ts +2 -2
  128. package/src/parser/inline/extension/placeholder.test.ts +43 -43
  129. package/src/parser/inline/extension/placeholder.ts +4 -4
  130. package/src/parser/inline/html.test.ts +108 -108
  131. package/src/parser/inline/html.ts +10 -10
  132. package/src/parser/inline/htmlentity.test.ts +38 -38
  133. package/src/parser/inline/htmlentity.ts +5 -5
  134. package/src/parser/inline/insertion.test.ts +28 -28
  135. package/src/parser/inline/insertion.ts +4 -4
  136. package/src/parser/inline/italic.test.ts +55 -55
  137. package/src/parser/inline/italic.ts +4 -4
  138. package/src/parser/inline/link.test.ts +186 -187
  139. package/src/parser/inline/link.ts +16 -17
  140. package/src/parser/inline/mark.test.ts +31 -31
  141. package/src/parser/inline/mark.ts +5 -5
  142. package/src/parser/inline/math.test.ts +132 -132
  143. package/src/parser/inline/math.ts +2 -2
  144. package/src/parser/inline/media.test.ts +91 -91
  145. package/src/parser/inline/media.ts +15 -15
  146. package/src/parser/inline/reference.test.ts +109 -109
  147. package/src/parser/inline/reference.ts +15 -54
  148. package/src/parser/inline/remark.test.ts +50 -50
  149. package/src/parser/inline/remark.ts +5 -5
  150. package/src/parser/inline/ruby.test.ts +45 -45
  151. package/src/parser/inline/ruby.ts +17 -17
  152. package/src/parser/inline/shortmedia.test.ts +10 -10
  153. package/src/parser/inline/strong.test.ts +37 -37
  154. package/src/parser/inline/strong.ts +3 -3
  155. package/src/parser/inline/template.test.ts +23 -23
  156. package/src/parser/inline/template.ts +5 -5
  157. package/src/parser/inline.test.ts +224 -223
  158. package/src/parser/segment.ts +2 -2
  159. package/src/parser/source/escapable.test.ts +24 -24
  160. package/src/parser/source/escapable.ts +8 -8
  161. package/src/parser/source/line.test.ts +18 -18
  162. package/src/parser/source/str.ts +2 -2
  163. package/src/parser/source/text.test.ts +85 -85
  164. package/src/parser/source/text.ts +5 -5
  165. package/src/parser/source/unescapable.test.ts +24 -24
  166. package/src/parser/source/unescapable.ts +5 -5
  167. package/src/parser/util.ts +10 -11
  168. package/src/parser/visibility.ts +8 -9
  169. package/src/util/quote.ts +2 -1
package/markdown.d.ts CHANGED
@@ -1,32 +1,17 @@
1
- import { Parser, List, Data, Ctx, CtxOptions } from './src/combinator/data/parser';
2
- import { Dict } from 'spica/dict';
1
+ import { Parser, List, Node } from './src/combinator/data/parser';
2
+ import { Context } from './src/parser/context';
3
3
 
4
4
  declare abstract class Markdown<T> {
5
5
  private parser?: T;
6
6
  }
7
7
  export interface MarkdownParser extends
8
8
  Markdown<'markdown'>,
9
- Parser<DocumentFragment, MarkdownParser.Context, [
9
+ Parser<DocumentFragment, Context, [
10
10
  MarkdownParser.HeaderParser,
11
11
  MarkdownParser.BlockParser,
12
12
  ]> {
13
13
  }
14
14
  export namespace MarkdownParser {
15
- export interface Context extends Ctx, Options {
16
- buffer?: List<Data<(string | HTMLElement)>>;
17
- sequential?: boolean;
18
- }
19
- export interface Options extends CtxOptions {
20
- readonly host?: URL;
21
- readonly url?: URL;
22
- readonly id?: string;
23
- readonly header?: boolean;
24
- readonly caches?: {
25
- readonly code?: Dict<string, HTMLElement>;
26
- readonly math?: Dict<string, HTMLElement>;
27
- readonly media?: Dict<string, HTMLElement>;
28
- };
29
- }
30
15
  export interface SegmentParser extends
31
16
  Markdown<'segment'>,
32
17
  Parser<string, Context, [
@@ -434,7 +419,7 @@ export namespace MarkdownParser {
434
419
  }
435
420
  export interface RowParser extends
436
421
  Block<'extension/table/row'>,
437
- Parser<List<Data<[string[], string[]?] | HTMLTableCellElement>>, Context, [
422
+ Parser<List<Node<[string[], string[]?] | HTMLTableCellElement>>, Context, [
438
423
  Parser<[string[], string[]?], Context, [
439
424
  AlignParser,
440
425
  ]>,
@@ -791,7 +776,7 @@ export namespace MarkdownParser {
791
776
  export interface TextLinkParser extends
792
777
  Inline<'link/textlink'>,
793
778
  Parser<HTMLAnchorElement | HTMLSpanElement, Context, [
794
- Parser<List<Data<string | HTMLElement>>, Context, [
779
+ Parser<List<Node<string | HTMLElement>>, Context, [
795
780
  InlineParser,
796
781
  ]>,
797
782
  LinkParser.ParameterParser,
@@ -800,7 +785,7 @@ export namespace MarkdownParser {
800
785
  export interface MediaLinkParser extends
801
786
  Inline<'link/medialink'>,
802
787
  Parser<HTMLAnchorElement | HTMLSpanElement, Context, [
803
- Parser<List<Data<HTMLElement>>, Context, [
788
+ Parser<List<Node<HTMLElement>>, Context, [
804
789
  MediaParser,
805
790
  ShortMediaParser,
806
791
  ]>,
@@ -809,7 +794,7 @@ export namespace MarkdownParser {
809
794
  }
810
795
  export interface ContentParser extends
811
796
  Inline<'link/content'>,
812
- Parser<List<Data<string | HTMLElement>>, Context, [
797
+ Parser<List<Node<string | HTMLElement>>, Context, [
813
798
  MediaParser,
814
799
  ShortMediaParser,
815
800
  InlineParser,
@@ -817,13 +802,13 @@ export namespace MarkdownParser {
817
802
  }
818
803
  export interface TextParser extends
819
804
  Inline<'link/text'>,
820
- Parser<List<Data<string>>, Context, [
805
+ Parser<List<Node<string>>, Context, [
821
806
  SourceParser.UnescapableSourceParser,
822
807
  ]> {
823
808
  }
824
809
  export interface ParameterParser extends
825
810
  Inline<'link/parameter'>,
826
- Parser<List<Data<string>>, Context, [
811
+ Parser<List<Node<string>>, Context, [
827
812
  LinkParser.ParameterParser.UriParser,
828
813
  LinkParser.ParameterParser.OptionParser,
829
814
  ]> {
@@ -858,7 +843,7 @@ export namespace MarkdownParser {
858
843
  export namespace MediaParser {
859
844
  export interface TextParser extends
860
845
  Inline<'media/text'>,
861
- Parser<List<Data<string>>, Context, [
846
+ Parser<List<Node<string>>, Context, [
862
847
  UnsafeHTMLEntityParser,
863
848
  TextParser.BracketParser,
864
849
  SourceParser.TxtParser,
@@ -892,7 +877,7 @@ export namespace MarkdownParser {
892
877
  }
893
878
  export interface ParameterParser extends
894
879
  Inline<'media/parameter'>,
895
- Parser<List<Data<string>>, Context, [
880
+ Parser<List<Node<string>>, Context, [
896
881
  LinkParser.ParameterParser.UriParser,
897
882
  ParameterParser.OptionParser,
898
883
  ]> {
@@ -911,8 +896,8 @@ export namespace MarkdownParser {
911
896
  // [AB](a b)
912
897
  Inline<'ruby'>,
913
898
  Parser<HTMLElement, Context, [
914
- Parser<List<Data<string>>, Context, []>,
915
- Parser<List<Data<string>>, Context, []>,
899
+ Parser<List<Node<string>>, Context, []>,
900
+ Parser<List<Node<string>>, Context, []>,
916
901
  ]> {
917
902
  }
918
903
  export namespace RubyParser {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "securemark",
3
- "version": "0.295.1",
3
+ "version": "0.295.2",
4
4
  "description": "Secure markdown renderer working on browsers for user input data.",
5
5
  "private": false,
6
6
  "homepage": "https://github.com/falsandtru/securemark",
@@ -1,20 +1,18 @@
1
1
  import { block } from './block';
2
- import { List, Data, input } from '../../data/parser';
2
+ import { List, Node, Context, input } from '../../data/parser';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/block', () => {
6
6
  describe('block', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('invalid', () => {
10
- assert.throws(() => block(_ => new List<Data<string>>())(input(' \n', ctx)));
8
+ assert.throws(() => block(_ => new List<Node<string>>())(input(' \n', new Context())));
11
9
  });
12
10
 
13
11
  it('valid', () => {
14
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n', ctx)), ctx), [[], '']);
15
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
16
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '']);
17
- assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length - 1; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '\n']);
12
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n', new Context())), [[], '']);
13
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
14
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '']);
15
+ assert.deepStrictEqual(inspect(block(({ context }) => { context.position = context.source.length - 1; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '\n']);
18
16
  });
19
17
 
20
18
  });
@@ -1,4 +1,4 @@
1
- import { Parser, Input, List, Data, Ctx, Node, Context, failsafe } from '../../data/parser';
1
+ import { Parser, Input, List, Node, Context, failsafe } from '../../data/parser';
2
2
  import { matcher } from '../../../combinator';
3
3
 
4
4
  //export function contract<P extends Parser>(patterns: string | RegExp | (string | RegExp)[], parser: P, cond: (nodes: readonly Data<P>[], rest: string) => boolean): P;
@@ -7,8 +7,8 @@ import { matcher } from '../../../combinator';
7
7
  //}
8
8
 
9
9
  export function validate<P extends Parser>(pattern: string | RegExp, parser: P): P;
10
- export function validate<P extends Parser>(cond: ((input: Input<Context<P>>) => boolean), parser: P): P;
11
- export function validate<N>(pattern: string | RegExp | ((input: Input<Ctx>) => boolean), parser: Parser<N>): Parser<N> {
10
+ export function validate<P extends Parser>(cond: ((input: Input<Parser.Context<P>>) => boolean), parser: P): P;
11
+ export function validate<N>(pattern: string | RegExp | ((input: Input<Context>) => boolean), parser: Parser<N>): Parser<N> {
12
12
  if (typeof pattern === 'function') return guard(pattern, parser);
13
13
  const match = matcher(pattern, false);
14
14
  return input => {
@@ -20,16 +20,16 @@ export function validate<N>(pattern: string | RegExp | ((input: Input<Ctx>) => b
20
20
  };
21
21
  }
22
22
 
23
- function guard<P extends Parser>(f: (input: Input<Context<P>>) => boolean, parser: P): P;
24
- function guard<N>(f: (input: Input<Ctx>) => boolean, parser: Parser<N>): Parser<N> {
23
+ function guard<P extends Parser>(f: (input: Input<Parser.Context<P>>) => boolean, parser: P): P;
24
+ function guard<N>(f: (input: Input<Context>) => boolean, parser: Parser<N>): Parser<N> {
25
25
  return input =>
26
26
  f(input)
27
27
  ? parser(input)
28
28
  : undefined;
29
29
  }
30
30
 
31
- export function verify<P extends Parser>(parser: P, cond: (nodes: List<Data<Node<P>>>, context: Context<P>) => boolean): P;
32
- export function verify<N>(parser: Parser<N>, cond: (nodes: List<Data<N>>, context: Ctx) => boolean): Parser<N> {
31
+ export function verify<P extends Parser>(parser: P, cond: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => boolean): P;
32
+ export function verify<N>(parser: Parser<N>, cond: (nodes: List<Node<N>>, context: Context) => boolean): Parser<N> {
33
33
  assert(parser);
34
34
  return failsafe(input => {
35
35
  const { context } = input;
@@ -1,21 +1,19 @@
1
- import { List, Data, input } from '../../data/parser';
1
+ import { List, Node, Context, input } from '../../data/parser';
2
2
  import { line } from './line';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/line', () => {
6
6
  describe('line', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('invalid', () => {
10
- assert.deepStrictEqual(inspect(line(_ => new List<Data<string>>())(input('', ctx)), ctx), undefined);
8
+ assert.deepStrictEqual(inspect(line(_ => new List<Node<string>>()), input('', new Context())), undefined);
11
9
  });
12
10
 
13
11
  it('valid', () => {
14
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' ', ctx)), ctx), [[], '']);
15
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n', ctx)), ctx), [[], '']);
16
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input('\n\n', ctx)), ctx), [[], '\n']);
17
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
18
- assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length - 1; return new List<Data<string>>(); })(input(' \n', ctx)), ctx), [[], '']);
12
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' ', new Context())), [[], '']);
13
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n', new Context())), [[], '']);
14
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input('\n\n', new Context())), [[], '\n']);
15
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
16
+ assert.deepStrictEqual(inspect(line(({ context }) => { context.position = context.source.length - 1; return new List<Node<string>>(); }), input(' \n', new Context())), [[], '']);
19
17
  });
20
18
 
21
19
  });
@@ -7,7 +7,6 @@ export function line<N>(parser: Parser<N>): Parser<N> {
7
7
  const { source, position } = context;
8
8
  if (position === source.length) return;
9
9
  const line = firstline(source, position);
10
- context.offset ??= 0;
11
10
  context.offset += position;
12
11
  const result = parser(input(line, context));
13
12
  context.position += position;
@@ -1,5 +1,5 @@
1
- import { Parser, List, Ctx } from '../../data/parser';
1
+ import { Parser, List, Context } from '../../data/parser';
2
2
 
3
- export function clear<D extends Parser<unknown, C>[], C extends Ctx>(parser: Parser<unknown, C, D>): Parser<never, C, D> {
3
+ export function clear<D extends Parser<unknown, C>[], C extends Context>(parser: Parser<unknown, C, D>): Parser<never, C, D> {
4
4
  return input => parser(input) && new List();
5
5
  }
@@ -1,7 +1,7 @@
1
- import { Parser, List, Ctx, Context, subinput, failsafe } from '../../data/parser';
1
+ import { Parser, List, Context, subinput, failsafe } from '../../data/parser';
2
2
 
3
- export function convert<P extends Parser>(conv: (source: string, context: Context<P>) => string, parser: P, empty?: boolean): P;
4
- export function convert<N>(conv: (source: string, context: Ctx) => string, parser: Parser<N>, empty = false): Parser<N> {
3
+ export function convert<P extends Parser>(conv: (source: string, context: Parser.Context<P>) => string, parser: P, empty?: boolean): P;
4
+ export function convert<N>(conv: (source: string, context: Context) => string, parser: Parser<N>, empty = false): Parser<N> {
5
5
  assert(parser);
6
6
  return failsafe(input => {
7
7
  const { context } = input;
@@ -1,7 +1,7 @@
1
- import { Parser, List, Data, Ctx } from '../../data/parser';
1
+ import { Parser, List, Node, Context } from '../../data/parser';
2
2
  import { fmap } from '../monad/fmap';
3
3
 
4
- export function dup<N, C extends Ctx, D extends Parser<unknown, C>[]>(parser: Parser<N, C, D>): Parser<List<Data<N>>, C, D>;
5
- export function dup<N>(parser: Parser<N>): Parser<List<Data<N>>> {
6
- return fmap(parser, nodes => new List([new Data(nodes)]));
4
+ export function dup<N, C extends Context, D extends Parser<unknown, C>[]>(parser: Parser<N, C, D>): Parser<List<Node<N>>, C, D>;
5
+ export function dup<N>(parser: Parser<N>): Parser<List<Node<N>>> {
6
+ return fmap(parser, nodes => new List([new Node(nodes)]));
7
7
  }
@@ -1,7 +1,7 @@
1
- import { Parser, Node, Context } from '../../data/parser';
1
+ import { Parser } from '../../data/parser';
2
2
  import { union } from '../../data/parser/union';
3
3
 
4
- export function fallback<P extends Parser>(parser: P, otherwise: Parser<Node<P>, Context<P>>): P;
4
+ export function fallback<P extends Parser>(parser: P, otherwise: Parser<Parser.Node<P>, Parser.Context<P>>): P;
5
5
  export function fallback<N>(parser: Parser<N>, otherwise: Parser<N>): Parser<N> {
6
6
  return union([parser, otherwise]);
7
7
  }
@@ -1,9 +1,9 @@
1
- import { Parser, List, Data, Ctx, failsafe } from '../../data/parser';
1
+ import { Parser, List, Node, Context, failsafe } from '../../data/parser';
2
2
  import { consume } from '../../../combinator';
3
3
  import { firstline, isBlankline } from '../constraint/line';
4
4
  import { push } from 'spica/array';
5
5
 
6
- export function fence<C extends Ctx, D extends Parser<unknown, C>[]>(opener: RegExp, limit: number, separation = true): Parser<string, C, D> {
6
+ export function fence<C extends Context, D extends Parser<unknown, C>[]>(opener: RegExp, limit: number, separation = true): Parser<string, C, D> {
7
7
  assert(!opener.flags.match(/[gm]/) && opener.sticky && !opener.source.startsWith('^'));
8
8
  return failsafe(input => {
9
9
  const { context } = input;
@@ -49,6 +49,6 @@ export function fence<C extends Ctx, D extends Parser<unknown, C>[]>(opener: Reg
49
49
  }
50
50
  context.position += line.length;
51
51
  }
52
- return new List(push([block, overflow, closer], matches).map(str => new Data(str)));
52
+ return new List(push([block, overflow, closer], matches).map(str => new Node(str)));
53
53
  });
54
54
  }
@@ -1,31 +1,29 @@
1
1
  import { indent } from './indent';
2
- import { List, Data, input } from '../../data/parser';
2
+ import { List, Node, Context, input } from '../../data/parser';
3
3
  import { inspect } from '../../../debug.test';
4
4
 
5
5
  describe('Unit: combinator/indent', () => {
6
6
  describe('indent', () => {
7
- const { context: ctx } = input('', {});
8
-
9
7
  it('valid', () => {
10
- const parser = indent(({ context }) => { context.position = context.source.length; return new List([new Data(context.source)]); });
11
- assert.deepStrictEqual(inspect(parser(input('', ctx)), ctx), undefined);
12
- assert.deepStrictEqual(inspect(parser(input(' ', ctx)), ctx), undefined);
13
- assert.deepStrictEqual(inspect(parser(input(' ', ctx)), ctx), undefined);
14
- assert.deepStrictEqual(inspect(parser(input('a ', ctx)), ctx), undefined);
15
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
16
- assert.deepStrictEqual(inspect(parser(input(' a ', ctx)), ctx), [['a '], '']);
17
- assert.deepStrictEqual(inspect(parser(input(' a\n', ctx)), ctx), [['a'], '']);
18
- assert.deepStrictEqual(inspect(parser(input(' a \n', ctx)), ctx), [['a '], '']);
19
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
20
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
21
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [['a'], '']);
22
- assert.deepStrictEqual(inspect(parser(input(' a', ctx)), ctx), [[' a'], '']);
23
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\na'], '']);
24
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\n a'], '']);
25
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a\n a'], '']);
26
- assert.deepStrictEqual(inspect(parser(input(' a\n a', ctx)), ctx), [['a'], ' a']);
27
- assert.deepStrictEqual(inspect(parser(input(' \ta', ctx)), ctx), [['\ta'], '']);
28
- assert.deepStrictEqual(inspect(parser(input('\ta', ctx)), ctx), [['a'], '']);
8
+ const parser = indent(({ context }) => { context.position = context.source.length; return new List([new Node(context.source)]); });
9
+ assert.deepStrictEqual(inspect(parser, input('', new Context())), undefined);
10
+ assert.deepStrictEqual(inspect(parser, input(' ', new Context())), undefined);
11
+ assert.deepStrictEqual(inspect(parser, input(' ', new Context())), undefined);
12
+ assert.deepStrictEqual(inspect(parser, input('a ', new Context())), undefined);
13
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
14
+ assert.deepStrictEqual(inspect(parser, input(' a ', new Context())), [['a '], '']);
15
+ assert.deepStrictEqual(inspect(parser, input(' a\n', new Context())), [['a'], '']);
16
+ assert.deepStrictEqual(inspect(parser, input(' a \n', new Context())), [['a '], '']);
17
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
18
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
19
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [['a'], '']);
20
+ assert.deepStrictEqual(inspect(parser, input(' a', new Context())), [[' a'], '']);
21
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\na'], '']);
22
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\n a'], '']);
23
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a\n a'], '']);
24
+ assert.deepStrictEqual(inspect(parser, input(' a\n a', new Context())), [['a'], ' a']);
25
+ assert.deepStrictEqual(inspect(parser, input(' \ta', new Context())), [['\ta'], '']);
26
+ assert.deepStrictEqual(inspect(parser, input('\ta', new Context())), [['a'], '']);
29
27
  });
30
28
 
31
29
  });
@@ -1,4 +1,4 @@
1
- import { Parser, List, Data, subinput, failsafe } from '../../data/parser';
1
+ import { Parser, List, Node, subinput, failsafe } from '../../data/parser';
2
2
  import { some } from '../../data/parser/some';
3
3
  import { block } from '../constraint/block';
4
4
  import { line } from '../constraint/line';
@@ -24,7 +24,7 @@ export function indent<N>(opener: RegExp | Parser<N>, parser: Parser<N> | boolea
24
24
  some(line(open(indent, ({ context }) => {
25
25
  const { source, position } = context;
26
26
  context.position = source.length;
27
- return new List([new Data(source.slice(position))]);
27
+ return new List([new Node(source.slice(position))]);
28
28
  }))),
29
29
  ([indent]) => indent.length * 2 + -(indent[0] === ' '), [], 2 ** 4 - 1)), separation),
30
30
  (lines, context) =>
@@ -1,7 +1,7 @@
1
- import { Parser, Input, Result, Ctx, Node, Context } from '../../data/parser';
1
+ import { Parser, Input, Result, Context } from '../../data/parser';
2
2
 
3
- export function recover<P extends Parser>(parser: P, fallback: (input: Input<Context<P>>, reason: unknown) => Result<Node<P>>): P;
4
- export function recover<N>(parser: Parser<N>, fallback: (input: Input<Ctx>, reason: unknown) => Result<N>): Parser<N> {
3
+ export function recover<P extends Parser>(parser: P, fallback: (input: Input<Parser.Context<P>>, reason: unknown) => Result<Parser.Node<P>>): P;
4
+ export function recover<N>(parser: Parser<N>, fallback: (input: Input<Context>, reason: unknown) => Result<N>): Parser<N> {
5
5
  return input => {
6
6
  const { context } = input;
7
7
  const { source, position } = context;
@@ -1,8 +1,8 @@
1
- import { Parser, List, Data } from '../../data/parser';
1
+ import { Parser, List, Node } from '../../data/parser';
2
2
  import { fmap } from '../monad/fmap';
3
3
 
4
4
  export function reverse<P extends Parser>(parser: P): P;
5
5
  export function reverse<N>(parser: Parser<N>): Parser<N> {
6
- return fmap(parser, nodes => nodes.foldr((node, acc) => acc.push(nodes.delete(node)) && acc, new List<Data<N>>()));
6
+ return fmap(parser, nodes => nodes.foldr((node, acc) => acc.push(nodes.delete(node)) && acc, new List<Node<N>>()));
7
7
  }
8
8
 
@@ -1,4 +1,4 @@
1
- import { Parser, Context, input, failsafe } from '../../data/parser';
1
+ import { Parser, input, failsafe } from '../../data/parser';
2
2
  import { matcher } from '../../../combinator';
3
3
 
4
4
  export function focus<P extends Parser>(scope: string | RegExp, parser: P, slice?: boolean): P;
@@ -18,7 +18,6 @@ export function focus<N>(scope: string | RegExp, parser: Parser<N>, slice = true
18
18
  context.position += result && context.position === position ? range : 0;
19
19
  return result;
20
20
  }
21
- context.offset ??= 0;
22
21
  context.offset += position;
23
22
  const result = parser(input(src, context));
24
23
  context.position += position;
@@ -30,7 +29,7 @@ export function focus<N>(scope: string | RegExp, parser: Parser<N>, slice = true
30
29
  }
31
30
 
32
31
  //export function rewrite<N, C extends Ctx, D extends Parser<unknown, C>[]>(scope: Parser<unknown, C, D>, parser: Parser<N, C, never>): Parser<N, C, D>;
33
- export function rewrite<P extends Parser>(scope: Parser<unknown, Context<P>>, parser: P, slice?: boolean): P;
32
+ export function rewrite<P extends Parser>(scope: Parser<unknown, Parser.Context<P>>, parser: P, slice?: boolean): P;
34
33
  export function rewrite<N>(scope: Parser, parser: Parser<N>, slice = true): Parser<N> {
35
34
  assert(scope);
36
35
  assert(parser);
@@ -51,7 +50,6 @@ export function rewrite<N>(scope: Parser, parser: Parser<N>, slice = true): Pars
51
50
  const src = source.slice(position, context.position);
52
51
  assert(src !== '');
53
52
  assert(source.startsWith(src, position));
54
- context.offset ??= 0;
55
53
  context.offset += position;
56
54
  const res2 = parser(input(src, context));
57
55
  context.position += position;
@@ -1,54 +1,54 @@
1
- import { Parser, Result, List, Data, Ctx, Node, Context, SubParsers, SubNode, IntermediateParser, failsafe } from '../../data/parser';
1
+ import { Parser, Result, List, Node, Context, failsafe } from '../../data/parser';
2
2
  import { matcher, clear } from '../../../combinator';
3
3
 
4
4
  export function surround<P extends Parser, S = string>(
5
- opener: string | RegExp | Parser<S, Context<P>>, parser: IntermediateParser<P>, closer: string | RegExp | Parser<S, Context<P>>,
5
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: Parser.IntermediateParser<P>, closer: string | RegExp | Parser<S, Parser.Context<P>>,
6
6
  optional?: false,
7
7
  backtracks?: readonly number[],
8
- f?: (rss: [List<Data<S>>, List<Data<SubNode<P>>>, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
9
- g?: (rss: [List<Data<S>>, List<Data<SubNode<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
8
+ f?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
9
+ g?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
10
10
  ): P;
11
11
  export function surround<P extends Parser, S = string>(
12
- opener: string | RegExp | Parser<S, Context<P>>, parser: IntermediateParser<P>, closer: string | RegExp | Parser<S, Context<P>>,
12
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: Parser.IntermediateParser<P>, closer: string | RegExp | Parser<S, Parser.Context<P>>,
13
13
  optional?: boolean,
14
14
  backtracks?: readonly number[],
15
- f?: (rss: [List<Data<S>>, List<Data<SubNode<P>>> | undefined, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
16
- g?: (rss: [List<Data<S>>, List<Data<SubNode<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
15
+ f?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
16
+ g?: (rss: [List<Node<S>>, List<Node<Parser.SubNode<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
17
17
  ): P;
18
18
  export function surround<P extends Parser, S = string>(
19
- opener: string | RegExp | Parser<S, Context<P>>, parser: P, closer: string | RegExp | Parser<S, Context<P>>,
19
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
20
20
  optional?: false,
21
21
  backtracks?: readonly number[],
22
- f?: (rss: [List<Data<S>>, List<Data<Node<P>>>, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
23
- g?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
22
+ f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
23
+ g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
24
24
  ): P;
25
25
  export function surround<P extends Parser, S = string>(
26
- opener: string | RegExp | Parser<S, Context<P>>, parser: P, closer: string | RegExp | Parser<S, Context<P>>,
26
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
27
27
  optional?: boolean,
28
28
  backtracks?: readonly number[],
29
- f?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
30
- g?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
29
+ f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
30
+ g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
31
31
  ): P;
32
32
  export function surround<P extends Parser<string>, S = string>(
33
- opener: string | RegExp | Parser<S, Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Context<P>>,
33
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
34
34
  optional?: false,
35
35
  backtracks?: readonly number[],
36
- f?: (rss: [List<Data<S>>, List<Data<Node<P>>>, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
37
- g?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
36
+ f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>>, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
37
+ g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
38
38
  ): P;
39
39
  export function surround<P extends Parser<string>, S = string>(
40
- opener: string | RegExp | Parser<S, Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Context<P>>,
40
+ opener: string | RegExp | Parser<S, Parser.Context<P>>, parser: string | RegExp | P, closer: string | RegExp | Parser<S, Parser.Context<P>>,
41
41
  optional?: boolean,
42
42
  backtracks?: readonly number[],
43
- f?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined, List<Data<S>>], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
44
- g?: (rss: [List<Data<S>>, List<Data<Node<P>>> | undefined], context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>,
43
+ f?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined, List<Node<S>>], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
44
+ g?: (rss: [List<Node<S>>, List<Node<Parser.Node<P>>> | undefined], context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>,
45
45
  ): P;
46
46
  export function surround<N>(
47
47
  opener: string | RegExp | Parser<N>, parser: string | RegExp | Parser<N>, closer: string | RegExp | Parser<N>,
48
48
  optional: boolean = false,
49
49
  backtracks: readonly number[] = [],
50
- f?: (rss: [List<Data<N>>, List<Data<N>>, List<Data<N>>], context: Ctx) => Result<N>,
51
- g?: (rss: [List<Data<N>>, List<Data<N>> | undefined], context: Ctx) => Result<N>,
50
+ f?: (rss: [List<Node<N>>, List<Node<N>>, List<Node<N>>], context: Context) => Result<N>,
51
+ g?: (rss: [List<Node<N>>, List<Node<N>> | undefined], context: Context) => Result<N>,
52
52
  ): Parser<N> {
53
53
  switch (typeof opener) {
54
54
  case 'string':
@@ -110,19 +110,19 @@ export function surround<N>(
110
110
  });
111
111
  }
112
112
  export function open<P extends Parser>(
113
- opener: string | RegExp | Parser<Node<P>, Context<P>>,
113
+ opener: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
114
114
  parser: P,
115
115
  optional?: boolean,
116
116
  backtracks?: readonly number[],
117
117
  ): P;
118
118
  export function open<P extends Parser<string>>(
119
- opener: string | RegExp | Parser<Node<P>, Context<P>>,
119
+ opener: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
120
120
  parser: string | RegExp | P,
121
121
  optional?: boolean,
122
122
  backtracks?: readonly number[],
123
123
  ): P;
124
124
  export function open<N>(
125
- opener: string | RegExp | Parser<N, Ctx>,
125
+ opener: string | RegExp | Parser<N, Context>,
126
126
  parser: string | RegExp | Parser<N>,
127
127
  optional?: boolean,
128
128
  backtracks: readonly number[] = [],
@@ -131,19 +131,19 @@ export function open<N>(
131
131
  }
132
132
  export function close<P extends Parser>(
133
133
  parser: P,
134
- closer: string | RegExp | Parser<Node<P>, Context<P>>,
134
+ closer: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
135
135
  optional?: boolean,
136
136
  backtracks?: readonly number[],
137
137
  ): P;
138
138
  export function close<P extends Parser<string>>(
139
139
  parser: string | RegExp | P,
140
- closer: string | RegExp | Parser<Node<P>, Context<P>>,
140
+ closer: string | RegExp | Parser<Parser.Node<P>, Parser.Context<P>>,
141
141
  optional?: boolean,
142
142
  backtracks?: readonly number[],
143
143
  ): P;
144
144
  export function close<N>(
145
145
  parser: string | RegExp | Parser<N>,
146
- closer: string | RegExp | Parser<N, Ctx>,
146
+ closer: string | RegExp | Parser<N, Context>,
147
147
  optional?: boolean,
148
148
  backtracks: readonly number[] = [],
149
149
  ): Parser<N> {
@@ -152,7 +152,7 @@ export function close<N>(
152
152
 
153
153
  const commandsize = 2;
154
154
  export function isBacktrack(
155
- context: Ctx,
155
+ context: Context,
156
156
  backtrack: number,
157
157
  position: number = context.position,
158
158
  length: number = 1,
@@ -160,14 +160,14 @@ export function isBacktrack(
160
160
  assert(1 & backtrack);
161
161
  assert(backtrack >>> commandsize);
162
162
  assert(0 < length && length < 3);
163
- const { backtracks = {}, offset = 0 } = context;
163
+ const { backtracks, offset } = context;
164
164
  for (let i = 0; i < length; ++i) {
165
165
  if (backtracks[position + i + offset] & backtrack >>> commandsize) return true;
166
166
  }
167
167
  return false;
168
168
  }
169
169
  export function setBacktrack(
170
- context: Ctx,
170
+ context: Context,
171
171
  backtrack: number,
172
172
  position: number,
173
173
  length: number = 1,
@@ -176,7 +176,7 @@ export function setBacktrack(
176
176
  assert(2 & backtrack);
177
177
  assert(backtrack >>> commandsize);
178
178
  assert(0 < length && length < 3);
179
- const { backtracks = {}, offset = 0 } = context;
179
+ const { backtracks, offset } = context;
180
180
  for (let i = 0; i < length; ++i) {
181
181
  backtracks[position + i + offset] |= backtrack >>> commandsize;
182
182
  }
@@ -202,6 +202,6 @@ function reduce(backtracks: readonly number[]): readonly [number, number, number
202
202
  return [len, rbs, wbs];
203
203
  }
204
204
 
205
- function revert(context: Ctx, linebreak: number | undefined): void {
205
+ function revert(context: Context, linebreak: number): void {
206
206
  context.linebreak = linebreak;
207
207
  }
@@ -1,10 +1,10 @@
1
- import { Parser, Result, List, Data, Ctx, Node, Context, SubParsers, SubNode, IntermediateParser, failsafe } from '../../data/parser';
1
+ import { Parser, Result, List, Node, Context, failsafe } from '../../data/parser';
2
2
 
3
- export function bind<P extends Parser>(parser: IntermediateParser<P>, f: (nodes: List<Data<SubNode<P>>>, context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>): P;
4
- export function bind<P extends Parser>(parser: P, f: (nodes: List<Data<Node<P>>>, context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>): P;
5
- export function bind<N, P extends Parser>(parser: Parser<N, Context<P>, SubParsers<P>>, f: (nodes: List<Data<N>>, context: Context<P>) => Result<Node<P>, Context<P>, SubParsers<P>>): P;
6
- export function bind<U, P extends Parser>(parser: P, f: (nodes: List<Data<Node<P>>>, context: Context<P>) => Result<U, Context<P>, SubParsers<P>>): Parser<U, Context<P>, SubParsers<P>>;
7
- export function bind<N, U>(parser: Parser<N>, f: (nodes: List<Data<N>>, context: Ctx) => Result<U>): Parser<U> {
3
+ export function bind<P extends Parser>(parser: Parser.IntermediateParser<P>, f: (nodes: List<Node<Parser.SubNode<P>>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
4
+ export function bind<P extends Parser>(parser: P, f: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
5
+ export function bind<N, P extends Parser>(parser: Parser<N, Parser.Context<P>, Parser.SubParsers<P>>, f: (nodes: List<Node<N>>, context: Parser.Context<P>) => Result<Parser.Node<P>, Parser.Context<P>, Parser.SubParsers<P>>): P;
6
+ export function bind<U, P extends Parser>(parser: P, f: (nodes: List<Node<Parser.Node<P>>>, context: Parser.Context<P>) => Result<U, Parser.Context<P>, Parser.SubParsers<P>>): Parser<U, Parser.Context<P>, Parser.SubParsers<P>>;
7
+ export function bind<N, U>(parser: Parser<N>, f: (nodes: List<Node<N>>, context: Context) => Result<U>): Parser<U> {
8
8
  assert(parser);
9
9
  return failsafe(input => {
10
10
  const { context } = input;