/
index.js
110 lines (93 loc) · 2.6 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* Seenk.js
* Flow controller powered by generators
* @version 0.2.2
*/
/**
*
* @param iterator {Generator} Generator
* @param resolve {function} Function resolves promise
* @param reject {function} Function rejects promise
* @param prevResult {*} Result of previous iteration
* @private
*/
function _yieldIterator(iterator, resolve, reject, prevResult){
var yieldResult;
prevResult = prevResult || {};
yieldResult = iterator.next(prevResult.value);
if(yieldResult.done){
resolve(yieldResult.value);
return;
}
if(yieldResult.value instanceof Promise){
return yieldResult.value
.then(function(nextResult){
_yieldIterator(iterator, resolve, reject, {value: nextResult, done: false});
})
.catch(function(err){
return reject(err);
})
}else if(yieldResult.value instanceof Array){
return Promise.all(yieldResult.value)
.then(function(nextResult){
_yieldIterator(iterator, resolve, reject, {value: nextResult, done: false});
})
.catch(function(err){
return reject(err);
})
}else{
return _yieldIterator(iterator, resolve, reject, yieldResult);
}
}
/**
* Handle your generator function
* @param generator {function} Generator function
* @returns {*}
* @private
*/
function _synchronize(generator){
//patch generator
var iterable = generator();
//run iterator and return promise
return new Promise(function(resolve, reject){
_yieldIterator(iterable, resolve, reject, {});
});
}
/**
* Syncronously map array of async functions
* @param asyncStack {Array} Array of async functions
* @returns {Array}
*/
function _map(asyncStack){
//synchronously run all functions in asyncStack using generator
return seenk(function*(){
return yield asyncStack;
});
}
/**
* Handle your generator function
* @param asyncStaff {function|Array} Generator function or an array of functions
* @returns {*}
*/
function seenk(asyncStaff){
//if function passed to seenk
if(typeof asyncStaff === 'function'){
//synchronize it
return _synchronize(asyncStaff);
//if passed an array
}else if(asyncStaff instanceof Array){
//map this array
return _map(asyncStaff);
}
}
/**
* Wrap generator by function returning promise
* @param generator {function} Generator function
* @returns {function}
*/
seenk.wrap = function(generator){
return function(){
return seenk(generator);
};
};
module.exports = seenk;