react 0.2.4 → 0.3.4

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 (65) hide show
  1. package/README.md +146 -94
  2. package/doc/alternate-dsls.md +103 -0
  3. package/{lib → dsl}/chain.js +5 -3
  4. package/{lib → dsl}/fstr.js +17 -6
  5. package/{lib → dsl}/pcode.js +19 -8
  6. package/examples/chain-events1.js +28 -7
  7. package/examples/chain1.js +2 -2
  8. package/examples/default-events1.js +33 -6
  9. package/examples/default-log-events.js +43 -0
  10. package/examples/fstr-events1.js +4 -17
  11. package/examples/fstr1.js +3 -2
  12. package/examples/pcode1.js +2 -2
  13. package/lib/base-task.js +8 -6
  14. package/lib/cb-task.js +14 -1
  15. package/lib/core.js +46 -15
  16. package/lib/dsl.js +14 -6
  17. package/lib/event-manager.js +29 -15
  18. package/lib/finalcb-first-task.js +16 -10
  19. package/lib/finalcb-task.js +17 -10
  20. package/lib/input-parser.js +7 -3
  21. package/lib/log-events.js +71 -0
  22. package/lib/parse.js +6 -3
  23. package/lib/promise-task.js +89 -0
  24. package/lib/ret-task.js +1 -1
  25. package/lib/task.js +32 -23
  26. package/lib/track-tasks.js +117 -0
  27. package/lib/validate.js +14 -5
  28. package/lib/vcon.js +8 -3
  29. package/lib/when-task.js +81 -0
  30. package/package.json +4 -2
  31. package/promise-resolve.js +35 -0
  32. package/react.js +0 -4
  33. package/test/core-deferred.test.js +134 -0
  34. package/test/core-promised.test.js +132 -0
  35. package/test/core-when.test.js +84 -0
  36. package/test/core.test.js +108 -60
  37. package/test/dsl.test.js +58 -6
  38. package/test/{chain.test.js → dsl/chain.test.js} +85 -1
  39. package/test/{fstr.test.js → dsl/fstr.test.js} +13 -1
  40. package/test/{pcode.test.js → dsl/pcode.test.js} +128 -1
  41. package/test/exec-options.test.js +2 -1
  42. package/test/finalcb-task.test.js +6 -5
  43. package/test/input-parser.test.js +10 -6
  44. package/test/module-use.test.js +13 -199
  45. package/test/promise-auto-resolve.test.js +51 -0
  46. package/test/validate.test.js +30 -1
  47. package/test/vcon.test.js +13 -0
  48. package/oldExamples/analyze.js +0 -29
  49. package/oldExamples/analyze2.js +0 -29
  50. package/oldExamples/example10-dsl.js +0 -63
  51. package/oldExamples/example11.js +0 -62
  52. package/oldExamples/example12.js +0 -63
  53. package/oldExamples/example13.js +0 -63
  54. package/oldExamples/example14.js +0 -63
  55. package/oldExamples/example15.js +0 -75
  56. package/oldExamples/example6-ast.js +0 -47
  57. package/oldExamples/example6-dsl.js +0 -49
  58. package/oldExamples/example8-ast.js +0 -55
  59. package/oldExamples/example8-dsl.js +0 -53
  60. package/oldExamples/example9-ast.js +0 -58
  61. package/oldExamples/example9-dsl.js +0 -57
  62. package/oldExamples/function-str-ex1.js +0 -33
  63. package/oldExamples/function-str-ex2.js +0 -67
  64. package/oldExamples/trait1.js +0 -41
  65. package/oldExamples/trait2.js +0 -44
@@ -3,7 +3,10 @@
3
3
  var test = require('tap').test;
4
4
  var BaseTask = require('../lib/base-task.js');
5
5
 
6
- var react = require('../react');
6
+ var react = require('../'); // require('react');
7
+ // turn on tracking, optionally obtain EventCollector
8
+ var EventCollector = require('../lib/track-tasks').EventCollector; // require('react/lib/track-tasks');
9
+
7
10
 
8
11
  /**
9
12
  @example
@@ -35,9 +38,7 @@ var react = require('../react');
35
38
  test('module exports an function object with properties', function (t) {
36
39
  t.type(react, 'function', 'is a core constructor and default dsl function');
37
40
  t.type(react.options, 'object', 'has property for global react options');
38
- t.type(react.fstrDefine, 'function', 'has fn property for using fstr dsl');
39
- t.type(react.pcodeDefine, 'function', 'has fn property for using pcode dsl');
40
- t.type(react.chainDefine, 'function', 'has fn property for chain define');
41
+ t.type(react.events, 'object', 'has global react event manager');
41
42
  t.end();
42
43
  });
43
44
 
@@ -81,6 +82,7 @@ test('use react() default DSL from module', function (t) {
81
82
  multiply, 'a, b, cb -> err, m',
82
83
  add, 'm, a, cb -> err, s'
83
84
  );
85
+
84
86
 
85
87
  fn(2, 3, function (err, m, s) {
86
88
  t.deepEqual(err, null, 'should not be any error');
@@ -98,10 +100,6 @@ test('use react.selectFirst() default DSL with events', function (t) {
98
100
  function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
99
101
  function add(a, b, cb) { cb(null, a + b); }
100
102
 
101
- var events = [];
102
- function accumEvents(task) {
103
- events.push(task);
104
- }
105
103
 
106
104
  var fn = react.selectFirst('mySelectFirst', 'a, b, cb -> err, c',
107
105
  noSuccess, 'a, b, cb -> err, c',
@@ -110,208 +108,24 @@ test('use react.selectFirst() default DSL with events', function (t) {
110
108
  noSuccess, 'a, b, cb -> err, c'
111
109
  );
112
110
 
113
- fn.events.on('task.complete', accumEvents);
114
-
115
- fn(2, 3, function (err, c) {
116
- t.deepEqual(err, null, 'should not be any error');
117
- t.equal(c, 5);
118
- t.equal(events.length, 3, 'should have seen two task compl events');
119
- t.equal(events[0].name, 'noSuccess', 'name matches');
120
- t.equal(events[1].name, 'noSuccessNull', 'name matches');
121
- t.equal(events[2].name, 'add', 'name matches');
122
- t.deepEqual(events[2].results, [5], 'results match');
123
- t.end();
124
- });
125
- });
126
-
127
-
128
- test('use pcodeDefine from module', function (t) {
129
- t.plan(3);
130
- function multiply(a, b, cb) { cb(null, a * b); }
131
- function add(a, b, cb) { cb(null, a + b); }
132
- var locals = { multiply: multiply, add: add };
133
- var fn = react.pcodeDefine('a, b, cb', [
134
- 'm := multiply(a, b)',
135
- 's := add(m, a)',
136
- 'cb(err, m, s)'
137
- ], locals);
138
-
139
- fn(2, 3, function (err, m, s) {
140
- t.deepEqual(err, null, 'should not be any error');
141
- t.equal(m, 6);
142
- t.equal(s, 8);
143
- t.end();
144
- });
145
- });
146
-
147
- test('use pcodeDefine with events', function (t) {
148
- t.plan(8);
149
- function multiply(a, b, cb) { cb(null, a * b); }
150
- function add(a, b, cb) { cb(null, a + b); }
151
-
152
- var events = [];
153
- function accumEvents(task) {
154
- events.push(task);
155
- }
156
-
157
- var locals = { multiply: multiply, add: add };
158
- var fn = react.pcodeDefine('a, b, cb', [
159
- 'm := multiply(a, b)',
160
- 's := add(m, a)',
161
- 'cb(err, m, s)'
162
- ], locals);
163
-
164
- fn.events.on('task.complete', accumEvents);
165
-
166
- fn(2, 3, function (err, m, s) {
167
- t.deepEqual(err, null, 'should not be any error');
168
- t.equal(m, 6);
169
- t.equal(s, 8);
170
- t.equal(events.length, 2, 'should have seen two task compl events');
171
- t.equal(events[0].name, 'multiply', 'name matches');
172
- t.deepEqual(events[0].results, [6], 'results match');
173
- t.equal(events[1].name, 'add', 'name matches');
174
- t.deepEqual(events[1].results, [8], 'results match');
175
- t.end();
176
- });
177
- });
178
-
179
- test('use pcodeDefine.selectFirst with events', function (t) {
180
- t.plan(7);
181
- function noSuccess(a, b, cb) {
182
- setTimeout(function () { cb(null); }, 100); // returns undefined result
183
- }
184
- function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
185
- function add(a, b, cb) { cb(null, a + b); }
186
-
187
- var events = [];
188
- function accumEvents(task) {
189
- events.push(task);
190
- }
191
-
192
- var locals = { noSuccess: noSuccess, noSuccessNull: noSuccessNull, add: add };
193
- var fn = react.pcodeDefine.selectFirst('a, b, cb', [
194
- 'c := noSuccess(a, b)',
195
- 'c := noSuccessNull(a, b)',
196
- 'c := add(a, b)',
197
- 'c := noSuccess(a, b)',
198
- 'cb(err, c)'
199
- ], locals);
200
-
201
- fn.events.on('task.complete', accumEvents);
111
+ var collector = new EventCollector();
112
+ collector.capture(fn, 'task.complete');
202
113
 
203
114
  fn(2, 3, function (err, c) {
204
115
  t.deepEqual(err, null, 'should not be any error');
205
116
  t.equal(c, 5);
117
+ var events = collector.list();
206
118
  t.equal(events.length, 3, 'should have seen two task compl events');
207
- t.equal(events[0].name, 'noSuccess', 'name matches');
208
- t.equal(events[1].name, 'noSuccessNull', 'name matches');
209
- t.equal(events[2].name, 'add', 'name matches');
210
- t.deepEqual(events[2].results, [5], 'results match');
211
- t.end();
212
- });
213
- });
214
-
215
- test('use pcodeDefine events emit to global emitter', function (t) {
216
- t.plan(8);
217
- function multiply(a, b, cb) { cb(null, a * b); }
218
- function add(a, b, cb) { cb(null, a + b); }
219
-
220
- var events = [];
221
- function accumEvents(task) {
222
- events.push(task);
223
- }
224
-
225
- var locals = { multiply: multiply, add: add };
226
- var fn = react.pcodeDefine('a, b, cb', [
227
- 'm := multiply(a, b)',
228
- 's := add(m, a)',
229
- 'cb(err, m, s)'
230
- ], locals);
231
-
232
- react.events.on('task.complete', accumEvents); // the global react emitter
233
-
234
- fn(2, 3, function (err, m, s) {
235
- t.deepEqual(err, null, 'should not be any error');
236
- t.equal(m, 6);
237
- t.equal(s, 8);
238
- t.equal(events.length, 2, 'should have seen two task compl events');
239
- t.equal(events[0].name, 'multiply', 'name matches');
240
- t.deepEqual(events[0].results, [6], 'results match');
241
- t.equal(events[1].name, 'add', 'name matches');
242
- t.deepEqual(events[1].results, [8], 'results match');
119
+ t.equal(events[0].task.name, 'noSuccess', 'name matches');
120
+ t.equal(events[1].task.name, 'noSuccessNull', 'name matches');
121
+ t.equal(events[2].task.name, 'add', 'name matches');
122
+ t.deepEqual(events[2].task.results, [5], 'results match');
243
123
  t.end();
244
124
  });
245
125
  });
246
126
 
247
127
 
248
128
 
249
- test('chainDefine use', function (t) {
250
- t.plan(8);
251
- function multiply(a, b, cb) { cb(null, a * b); }
252
- function add(a, b, cb) { cb(null, a + b); }
253
-
254
- var events = [];
255
- function accumEvents(task) {
256
- events.push(task);
257
- }
258
-
259
- var fn = react.chainDefine()
260
- .in('a', 'b', 'cb')
261
- .out('err', 'm', 's')
262
- .async(multiply).in('a', 'b', 'cb').out('err', 'm')
263
- .async(add).in('m', 'a', 'cb').out('err', 's')
264
- .end();
265
-
266
- fn.events.on('task.complete', accumEvents);
267
-
268
- fn(2, 3, function (err, m, s) {
269
- t.deepEqual(err, null, 'should not be any error');
270
- t.equal(m, 6);
271
- t.equal(s, 8);
272
- t.equal(events.length, 2, 'should have seen two task compl events');
273
- t.equal(events[0].name, 'multiply', 'name matches');
274
- t.deepEqual(events[0].results, [6], 'results match');
275
- t.equal(events[1].name, 'add', 'name matches');
276
- t.deepEqual(events[1].results, [8], 'results match');
277
- t.end();
278
- });
279
- });
280
-
281
- test('use chainDefine selectFirst with events', function (t) {
282
- t.plan(7);
283
- function noSuccess(a, b, cb) {
284
- setTimeout(function () { cb(null); }, 100); // returns undefined result
285
- }
286
- function noSuccessNull(a, b, cb) { cb(null, null); } // returns null result
287
- function add(a, b, cb) { cb(null, a + b); }
288
129
 
289
- var events = [];
290
- function accumEvents(task) {
291
- events.push(task);
292
- }
293
130
 
294
- var fn = react.chainDefine()
295
- .selectFirst()
296
- .in('a', 'b', 'cb')
297
- .out('err', 'c')
298
- .async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
299
- .async(noSuccessNull).in('a', 'b', 'cb').out('err', 'c')
300
- .async(add).in('a', 'b', 'cb').out('err', 'c')
301
- .async(noSuccess).in('a', 'b', 'cb').out('err', 'c')
302
- .end();
303
-
304
- fn.events.on('task.complete', accumEvents);
305
-
306
- fn(2, 3, function (err, c) {
307
- t.deepEqual(err, null, 'should not be any error');
308
- t.equal(c, 5);
309
- t.equal(events.length, 3, 'should have seen two task compl events');
310
- t.equal(events[0].name, 'noSuccess', 'name matches');
311
- t.equal(events[1].name, 'noSuccessNull', 'name matches');
312
- t.equal(events[2].name, 'add', 'name matches');
313
- t.deepEqual(events[2].results, [5], 'results match');
314
- t.end();
315
- });
316
- });
317
131
 
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ Test that arguments which are promises are automatically resolved
5
+ before calling react functions
6
+ */
7
+
8
+ var test = require('tap').test;
9
+ var Deferred = require('promised-io/promise').Deferred;
10
+
11
+ var react = require('../promise-resolve'); // require('react/promise-resolve');
12
+
13
+ function multiply(x, y, cb) { cb(null, x * y); }
14
+ function add(x, y, cb) { cb(null, x + y); }
15
+ // function badF2(a, b, cb) { cb('my-error'); }
16
+
17
+ test('auto resolve promises passed as args', function (t) {
18
+ t.plan(4);
19
+ var fn = react();
20
+ var errors = fn.setAndValidateAST({
21
+ inParams: ['a', 'b'],
22
+ tasks: [
23
+ { f: multiply, a: ['a', 'b'], out: ['c'] },
24
+ { f: add, a: ['c', 'b'], out: ['d'] }
25
+ ],
26
+ outTask: { a: ['c', 'd'] }
27
+ });
28
+ t.deepEqual(errors, [], 'no validation errors');
29
+
30
+ function retAP() {
31
+ var deferred = new Deferred();
32
+ setTimeout(function () { deferred.resolve(2); }, 10);
33
+ return deferred.promise;
34
+ }
35
+
36
+ function retBP() {
37
+ var deferred = new Deferred();
38
+ setTimeout(function () { deferred.resolve(3); }, 10);
39
+ return deferred.promise;
40
+ }
41
+
42
+ var ap = retAP();
43
+ var bp = retBP();
44
+
45
+ fn(ap, bp, function (err, c, d) {
46
+ t.equal(err, null);
47
+ t.equal(c, 6);
48
+ t.equal(d, 9);
49
+ t.end();
50
+ });
51
+ });
@@ -263,4 +263,33 @@ test('missing or mispelled final output variables', function (t) {
263
263
  ];
264
264
  t.deepEqual(validate(ast), messages);
265
265
  t.end();
266
- });
266
+ });
267
+
268
+ test('missing or mispelled validation ignores properties', function (t) {
269
+ var ast = {
270
+ inParams: ['obj'],
271
+ tasks: [
272
+ { f: foo, a: ['obj.foo'], out: [] },
273
+ { f: bar, a: ['obj.bar'], out: [] }
274
+ ],
275
+ outTask: { a: ['obj.cat'] }
276
+ };
277
+ t.deepEqual(validate(ast), []);
278
+ t.end();
279
+ });
280
+
281
+ test('missing or mispelled validation ignores literals', function (t) {
282
+ var ast = {
283
+ inParams: [],
284
+ tasks: [
285
+ { f: foo, a: ['true', 'false', '123', '123.1', 'null'], out: [] },
286
+ { f: bar, a: ['-123', '-123.4', '"wow"', "'hey'"], out: [] },
287
+ { f: foo, a: ['"two-words"', "'also-two'", '"two.words"', "'also.two'"], out: [] },
288
+ { f: foo, a: ['this'], out: [] }
289
+ ],
290
+ outTask: { a: [] }
291
+ };
292
+ t.deepEqual(validate(ast), []);
293
+ t.end();
294
+ });
295
+
package/test/vcon.test.js CHANGED
@@ -67,12 +67,25 @@ test('simple getVar returns existing value', function (t) {
67
67
  test('getVar on literals returns the literal', function (t) {
68
68
  t.equal(VContext.create([], []).getVar(true), true);
69
69
  t.equal(VContext.create([], []).getVar(false), false);
70
+ t.equal(VContext.create([], []).getVar(null), null);
71
+ t.equal(VContext.create([], []).getVar('true'), true);
72
+ t.equal(VContext.create([], []).getVar('false'), false);
73
+ t.equal(VContext.create([], []).getVar('null'), null);
70
74
  t.equal(VContext.create([], []).getVar(-100), -100);
71
75
  t.equal(VContext.create([], []).getVar(100), 100);
72
76
  t.equal(VContext.create([], []).getVar(123.4), 123.4);
73
77
  t.equal(VContext.create([], []).getVar(-987.6), -987.6);
78
+ t.equal(VContext.create([], []).getVar('-100'), -100);
79
+ t.equal(VContext.create([], []).getVar('100'), 100);
80
+ t.equal(VContext.create([], []).getVar('123.4'), 123.4);
81
+ t.equal(VContext.create([], []).getVar('-987.6'), -987.6);
74
82
  t.equal(VContext.create([], []).getVar('"foo"'), 'foo');
75
83
  t.equal(VContext.create([], []).getVar("'foo'"), 'foo');
84
+ t.equal(VContext.create([], []).getVar("'foo.bar'"), 'foo.bar');
85
+ t.equal(VContext.create([], []).getVar("'foo-bar'"), 'foo-bar');
86
+ t.equal(VContext.create([], []).getVar("'foo-bar.json'"), 'foo-bar.json');
87
+ t.equal(VContext.create([], []).getVar('"foo-bar.json"'), 'foo-bar.json');
88
+ t.deepEqual(VContext.create([], [], null, { a: 1}).getVar('this'), { a: 1});
76
89
  t.end();
77
90
  });
78
91
 
@@ -1,29 +0,0 @@
1
- 'use strict';
2
-
3
- function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
4
- function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
5
- function markdown(filedata) { return 'html' + filedata; }
6
- function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
7
- function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
8
- function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
9
- function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
10
- function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
11
-
12
- function analyze(fn) {
13
- console.log(fn.toString());
14
- }
15
-
16
- var fn = analyze(function loadAndSend(filename, uid, outDirname, cb,
17
- R, filedata, outDirName, dircreated, emailmd, emailHtml,
18
- custEmailHtml, deliveredEmail, err, user, html, bytesWritten) {
19
- R.async(loadUser, uid).cb(err, user)
20
- .async(loadFile, filename).cb(err, filedata)
21
- .sync(markdown, filedata).returns(filedata)
22
- .async(prepareDirectory, outDirName).cb(dircreated)
23
- .async(writeOutput, html, user).cb(err, bytesWritten).after(prepareDirectory)
24
- .async(loadEmailTemplate).cb(err, emailmd)
25
- .sync(markdown, emailmd).returns(emailHtml)
26
- .sync(customizeEmail, user, emailHtml).returns(custEmailHtml)
27
- .sync(deliverEmail, custEmailHtml).returns(deliveredEmail).after(writeOutput)
28
- .finalCb(err, html, user, bytesWritten);
29
- });
@@ -1,29 +0,0 @@
1
- 'use strict';
2
-
3
- function loadUser(uid, cb) { setTimeout(cb, 100, null, "User" + uid); }
4
- function loadFile(filename, cb) { setTimeout(cb, 100, null, 'Filedata' + filename); }
5
- function markdown(filedata) { return 'html' + filedata; }
6
- function prepareDirectory(outDirname, cb) { setTimeout(cb, 200, null, 'dircreated-' + outDirname); }
7
- function writeOutput(html, user, cb) { setTimeout(cb, 300, null, html + '_bytesWritten'); }
8
- function loadEmailTemplate(cb) { setTimeout(cb, 50, null, 'emailmd'); }
9
- function customizeEmail(user, emailHtml, cb) { return 'cust-' + user + emailHtml; }
10
- function deliverEmail(custEmailHtml, cb) { setTimeout(cb, 100, null, 'delivered-' + custEmailHtml); }
11
-
12
- function react(fn) {
13
- console.log(fn.toString());
14
- }
15
-
16
- var fn = react(function (R, filename, uid, outDirname, cb) {
17
- var filedata, outDirName, dircreated, emailmd, emailHtml,
18
- custEmailHtml, deliveredEmail, err, user, html, bytesWritten;
19
- R.async(loadUser).in(uid).out(err, user)
20
- .async(loadFile).in(filename).out(err, filedata)
21
- .sync(markdown, filedata).out(filedata)
22
- .async(prepareDirectory, outDirName).out(dircreated)
23
- .async(writeOutput, html, user).out(err, bytesWritten).after(prepareDirectory)
24
- .async(loadEmailTemplate).out(err, emailmd)
25
- .sync(markdown, emailmd).out(emailHtml)
26
- .sync(customizeEmail, user, emailHtml).out(custEmailHtml)
27
- .sync(deliverEmail, custEmailHtml).out(deliveredEmail).after(writeOutput)
28
- .cb(err, html, user, bytesWritten);
29
- });
@@ -1,63 +0,0 @@
1
-
2
-
3
- var reactMod = require(__dirname+'/../lib/react.js');
4
- var react = reactMod.react;
5
-
6
- var r = react('allStart, titlesFile, numQueries, numFactors, cb').define(
7
- openTitlesStream, 'titlesFile -> err, fileStream', { tasks: [
8
- split, 'fileStream -> err, lineStream',
9
- filterLines, 'lineStream, numQueries -> err, filteredLineStream',
10
- trimLines, 'filteredLineStream -> err, trimmedLineStream',
11
- recordTime, ' -> returns qStart', { after: trimLines },
12
- runQuery, 'trimmedLineStream, numFactors -> err, qResults', { after: recordTime },
13
- calcTime, 'qStart -> returns qTime', { after: runQuery },
14
- sumTotal, 'qTime -> returns qTotal', { reduce: true }
15
- ], cb:'-> err, qTotal' },
16
- calcTime, 'allStart -> returns allElapsed', { after: openTitlesStream }
17
- ).callbackDef('allElapsed, qTotal, numQueries, numFactors');
18
-
19
-
20
-
21
- //new simpler syntax
22
-
23
- var react = require('react');
24
-
25
- var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb',
26
- foo, 'bar -> err, baz',
27
- cat, 'baz -> err, zoo',
28
- '-> err, allElapse, qTotal');
29
-
30
- var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
31
- foo, 'bar -> err, baz',
32
- cat, 'baz -> returns zoo'
33
- ], 'err, allElapse, qTotal');
34
-
35
- var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
36
- foo, 'bar => err, baz',
37
- cat, 'baz -> returns zoo'
38
- ], 'err, allElapse, qTotal');
39
-
40
- var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb', [
41
- foo, 'bar -> err, baz',
42
- 'zoo <- ', cat, 'baz',
43
- ], 'err, allElapse, qTotal');
44
-
45
-
46
-
47
- var loadAndSave = react('allStart, titlesFile, numQueries, numFactors, cb -> err, allElapse, qTotal',
48
- foo, 'bar -> err, baz',
49
- cat, 'baz -> err, zoo');
50
- loadAndSave(1, 2, 3, cb);
51
-
52
- OR using AST
53
-
54
- var loadAndSave = react();
55
- loadAndSave.ast.inputs(['one', 'two'])
56
- .tasks({ })
57
- .outTask({ });
58
-
59
- loadAndSave(1,2,cb);
60
-
61
-
62
-
63
-