extra-parser 0.2.4 → 0.3.0

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/README.md CHANGED
@@ -27,13 +27,16 @@ interface INodePatternMatch<Node extends INode<string>> {
27
27
  node: Node
28
28
  }
29
29
 
30
- type TokenPattern<Token extends IToken<string>> =
31
- (text: string) => ITokenPatternMatch<Token> | Falsy
30
+ interface ITokenPattern<Token extends IToken<string>> {
31
+ (text: string): Awaitable<ITokenPatternMatch<Token> | Falsy>
32
+ }
32
33
 
33
- type NodePattern<
34
+ interface INodePattern<
34
35
  Token extends IToken<string>
35
36
  , Node extends INode<string>
36
- > = (tokens: Array<Token>) => INodePatternMatch<Node> | Falsy
37
+ > {
38
+ (tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>
39
+ }
37
40
  ```
38
41
 
39
42
  ### tokenize
@@ -44,7 +47,7 @@ function tokenize<
44
47
  >(
45
48
  text: string
46
49
  , patterns: Array<TokenPattern>
47
- ): IterableIterator<Token>
50
+ ): AsyncIterableIterator<Token>
48
51
  ```
49
52
 
50
53
  ### parse
@@ -52,11 +55,11 @@ function tokenize<
52
55
  function parse<
53
56
  Token extends IToken<string>
54
57
  , Node extends INode<string>
55
- , NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
58
+ , NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>
56
59
  >(
57
60
  tokens: Array<Token>
58
61
  , patterns: Array<NodePattern>
59
- ): IterableIterator<Node>
62
+ ): AsyncIterableIterator<Node>
60
63
  ```
61
64
 
62
65
  ### createTokenPatternFromRegExp
@@ -70,3 +73,14 @@ function createTokenPatternFromRegExp<Token extends IToken<string>>(
70
73
  , regExp: RegExp
71
74
  ): ITokenPattern<IToken<Token['type']>>
72
75
  ```
76
+
77
+ ## FAQ
78
+ ### Why are functions asynchronous?
79
+ Some parsers make heavy use of recursion,
80
+ and most JavaScript engines do not support tail-call optimization,
81
+ which leads to the possibility of stack overflow in programs.
82
+
83
+ Asynchronous functions are an escape route:
84
+ developers can change recursive functions to asynchronous recursive functions
85
+ to get their programs out of stack overflow problems
86
+ without significantly reducing readability.
package/lib/parse.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  import { IToken, INodePattern, INode } from './types';
2
- export declare function parse<Token extends IToken<string>, Node extends INode<string>, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>>(tokens: Array<Token>, patterns: Array<NodePattern>): IterableIterator<Node>;
2
+ export declare function parse<Token extends IToken<string>, Node extends INode<string>, NodePattern extends INodePattern<Token, Node> = INodePattern<Token, Node>>(tokens: Array<Token>, patterns: Array<NodePattern>): AsyncIterableIterator<Node>;
package/lib/parse.js CHANGED
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parse = void 0;
4
4
  const prelude_1 = require("@blackglory/prelude");
5
- function* parse(tokens, patterns) {
5
+ async function* parse(tokens, patterns) {
6
6
  let i = 0;
7
7
  loop: while (i < tokens.length) {
8
8
  const remainingTokens = tokens.slice(i);
9
9
  for (const pattern of patterns) {
10
- const result = pattern(remainingTokens);
10
+ const result = await pattern(remainingTokens);
11
11
  if ((0, prelude_1.isntFalsy)(result)) {
12
12
  yield result.node;
13
13
  i += result.consumed;
package/lib/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAG/C,QAAe,CAAC,CAAC,KAAK,CAKpB,MAAoB,EACpB,QAA4B;IAE5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;QAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;YACvC,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,IAAI,CAAA;gBACjB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;KAC1E;AACH,CAAC;AAvBD,sBAuBC"}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAGxC,KAAK,SAAS,CAAC,CAAC,KAAK,CAK1B,MAAoB,EACpB,QAA4B;IAE5B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;QAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAA;YAC7C,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,IAAI,CAAA;gBACjB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;KAC1E;AACH,CAAC;AAvBD,sBAuBC"}
package/lib/tokenize.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  import { ITokenPattern, IToken } from './types';
2
- export declare function tokenize<Token extends IToken<string>, TokenPattern extends ITokenPattern<Token> = ITokenPattern<Token>>(text: string, patterns: Array<TokenPattern>): IterableIterator<Token>;
2
+ export declare function tokenize<Token extends IToken<string>, TokenPattern extends ITokenPattern<Token> = ITokenPattern<Token>>(text: string, patterns: Array<TokenPattern>): AsyncIterableIterator<Token>;
package/lib/tokenize.js CHANGED
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.tokenize = void 0;
4
4
  const prelude_1 = require("@blackglory/prelude");
5
- function* tokenize(text, patterns) {
5
+ async function* tokenize(text, patterns) {
6
6
  let i = 0;
7
7
  loop: while (i < text.length) {
8
8
  const remainingText = text.slice(i);
9
9
  for (const pattern of patterns) {
10
- const result = pattern(remainingText);
10
+ const result = await pattern(remainingText);
11
11
  if ((0, prelude_1.isntFalsy)(result)) {
12
12
  yield result.token;
13
13
  i += result.consumed;
@@ -1 +1 @@
1
- {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAG/C,QAAe,CAAC,CAAC,QAAQ,CAIvB,IAAY,EACZ,QAA6B;IAE7B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;YACrC,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,KAAK,CAAA;gBAClB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;KAClE;AACH,CAAC;AAtBD,4BAsBC"}
1
+ {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAGxC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAI7B,IAAY,EACZ,QAA6B;IAE7B,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;YAC3C,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,EAAE;gBACrB,MAAM,MAAM,CAAC,KAAK,CAAA;gBAClB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAA;gBACpB,SAAS,IAAI,CAAA;aACd;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;KAClE;AACH,CAAC;AAtBD,4BAsBC"}
package/lib/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Falsy } from '@blackglory/prelude';
1
+ import { Falsy, Awaitable } from '@blackglory/prelude';
2
2
  export interface IToken<Type extends string> {
3
3
  type: Type;
4
4
  value: string;
@@ -15,8 +15,8 @@ export interface INodePatternMatch<Node extends INode<string>> {
15
15
  node: Node;
16
16
  }
17
17
  export interface ITokenPattern<Token extends IToken<string>> {
18
- (text: string): ITokenPatternMatch<Token> | Falsy;
18
+ (text: string): Awaitable<ITokenPatternMatch<Token> | Falsy>;
19
19
  }
20
20
  export interface INodePattern<Token extends IToken<string>, Node extends INode<string>> {
21
- (tokens: Array<Token>): INodePatternMatch<Node> | Falsy;
21
+ (tokens: ReadonlyArray<Token>): Awaitable<INodePatternMatch<Node> | Falsy>;
22
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "extra-parser",
3
- "version": "0.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "files": [