+65
-6
lines changedFilter options
+65
-6
lines changed Original file line number Diff line number Diff line change
@@ -145,7 +145,7 @@ export function callRule(rule: Rule, input: Tree_2 | Observable<Tree_2>, context
145
145
export function callSource(source: Source, context: SchematicContext): Observable<Tree_2>;
146
146
147
147
// @public
148
-
export function chain(rules: Rule[]): Rule;
148
+
export function chain(rules: Iterable<Rule> | AsyncIterable<Rule>): Rule;
149
149
150
150
// @public (undocumented)
151
151
export class CircularCollectionException extends BaseException {
Original file line number Diff line number Diff line change
@@ -33,9 +33,14 @@ export function empty(): Source {
33
33
/**
34
34
* Chain multiple rules into a single rule.
35
35
*/
36
-
export function chain(rules: Rule[]): Rule {
37
-
return (tree, context) => {
38
-
return rules.reduce<Tree | Observable<Tree>>((acc, curr) => callRule(curr, acc, context), tree);
36
+
export function chain(rules: Iterable<Rule> | AsyncIterable<Rule>): Rule {
37
+
return async (initialTree, context) => {
38
+
let intermediateTree: Observable<Tree> | undefined;
39
+
for await (const rule of rules) {
40
+
intermediateTree = callRule(rule, intermediateTree ?? initialTree, context);
41
+
}
42
+
43
+
return () => intermediateTree;
39
44
};
40
45
}
41
46
Original file line number Diff line number Diff line change
@@ -17,11 +17,11 @@ import { apply, applyToSubtree, chain } from './base';
17
17
import { callRule, callSource } from './call';
18
18
import { move } from './move';
19
19
20
-
const context: SchematicContext = ({
20
+
const context: SchematicContext = {
21
21
engine: null,
22
22
debug: false,
23
23
strategy: MergeStrategy.Default,
24
-
} as {}) as SchematicContext;
24
+
} as {} as SchematicContext;
25
25
26
26
describe('chain', () => {
27
27
it('works with simple rules', (done) => {
@@ -48,6 +48,60 @@ describe('chain', () => {
48
48
.then(done, done.fail);
49
49
});
50
50
51
+
it('works with a sync generator of rules', async () => {
52
+
const rulesCalled: Tree[] = [];
53
+
54
+
const tree0 = empty();
55
+
const tree1 = empty();
56
+
const tree2 = empty();
57
+
const tree3 = empty();
58
+
59
+
const rule0: Rule = (tree: Tree) => ((rulesCalled[0] = tree), tree1);
60
+
const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2);
61
+
const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3);
62
+
63
+
function* generateRules() {
64
+
yield rule0;
65
+
yield rule1;
66
+
yield rule2;
67
+
}
68
+
69
+
const result = await callRule(chain(generateRules()), tree0, context).toPromise();
70
+
71
+
expect(result).not.toBe(tree0);
72
+
expect(rulesCalled[0]).toBe(tree0);
73
+
expect(rulesCalled[1]).toBe(tree1);
74
+
expect(rulesCalled[2]).toBe(tree2);
75
+
expect(result).toBe(tree3);
76
+
});
77
+
78
+
it('works with an async generator of rules', async () => {
79
+
const rulesCalled: Tree[] = [];
80
+
81
+
const tree0 = empty();
82
+
const tree1 = empty();
83
+
const tree2 = empty();
84
+
const tree3 = empty();
85
+
86
+
const rule0: Rule = (tree: Tree) => ((rulesCalled[0] = tree), tree1);
87
+
const rule1: Rule = (tree: Tree) => ((rulesCalled[1] = tree), tree2);
88
+
const rule2: Rule = (tree: Tree) => ((rulesCalled[2] = tree), tree3);
89
+
90
+
async function* generateRules() {
91
+
yield rule0;
92
+
yield rule1;
93
+
yield rule2;
94
+
}
95
+
96
+
const result = await callRule(chain(generateRules()), tree0, context).toPromise();
97
+
98
+
expect(result).not.toBe(tree0);
99
+
expect(rulesCalled[0]).toBe(tree0);
100
+
expect(rulesCalled[1]).toBe(tree1);
101
+
expect(rulesCalled[2]).toBe(tree2);
102
+
expect(result).toBe(tree3);
103
+
});
104
+
51
105
it('works with observable rules', (done) => {
52
106
const rulesCalled: Tree[] = [];
53
107
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4