UNPKG

6.62 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.CLOSED = undefined;
7exports.chan = chan;
8exports.take = take;
9exports.put = put;
10exports.close = close;
11exports.go = go;
12exports.sleep = sleep;
13exports.clone = clone;
14exports.repeat = repeat;
15exports.repeatTake = repeatTake;
16exports.any = any;
17
18var _buffers = require('./buffers');
19
20var _buffers2 = _interopRequireDefault(_buffers);
21
22var _transducer_support = require('./transducer_support');
23
24var _transducer_support2 = _interopRequireDefault(_transducer_support);
25
26function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, "next"); var callThrow = step.bind(null, "throw"); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; }
29
30function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
31
32var CLOSED = exports.CLOSED = 'medium-closed-state';
33
34// CORE
35function chan(bufferOrN) {
36 var xduce = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
37 var opts = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
38
39 var buffer = typeof bufferOrN === 'number' ? _buffers2.default.fixed(bufferOrN) : bufferOrN || _buffers2.default.base();
40
41 return {
42 args: arguments,
43 opts: opts,
44 closed: false,
45 takes: [],
46 xduce: _transducer_support2.default.transform(xduce),
47 buffer: buffer
48 };
49}
50
51function take(ch) {
52
53 var take = createAction();
54
55 if (ch.closed) {
56 take.resolve(CLOSED);
57 return take.promise;
58 }
59
60 var put = ch.buffer.shift();
61 if (put) {
62 run(ch, put, take);
63 } else {
64 ch.takes.push(take);
65 }
66
67 return take.promise;
68}
69
70function put(ch, v) {
71
72 var put = createAction({ payload: v });
73
74 if (ch.closed) {
75 put.resolve(false);
76 return put.promise;
77 }
78
79 // handle transducer
80 put.payload = _transducer_support2.default.apply(ch.xduce, put.payload);
81 if (typeof put.payload === 'undefined') {
82 put.resolve(true);
83 return put.promise;
84 }
85
86 var take = ch.takes.shift();
87 if (take) {
88 run(ch, put, take);
89 } else {
90 ch.buffer.push(put);
91 }
92
93 return put.promise;
94}
95
96function close(ch) {
97 var currPut;
98 while (currPut = ch.buffer.shift()) {
99 currPut.resolve(false);
100 }
101 ch.takes.forEach(function (t) {
102 return t.resolve(CLOSED);
103 });
104 ch.closed = true;
105}
106
107function run(ch, put, take) {
108 take.resolve(put.payload);
109 put.resolve(true);
110}
111
112// UTILITIES
113function go(afn) {
114 return afn();
115}
116
117function sleep(ms) {
118 return new Promise(function (res) {
119 setTimeout(res, ms);
120 });
121}
122
123function clone(src) {
124 return chan.apply(undefined, _toConsumableArray(src.args));
125}
126
127function createAction() {
128 var config = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
129
130 var _resolve;
131
132 return {
133 payload: config.payload,
134 resolve: function resolve(payload) {
135 return _resolve(payload);
136 },
137 promise: new Promise(function (res) {
138 return _resolve = res;
139 })
140 };
141}
142
143function repeat(afn, seed) {
144 var _this = this;
145
146 go(_asyncToGenerator(regeneratorRuntime.mark(function _callee() {
147 var result;
148 return regeneratorRuntime.wrap(function _callee$(_context) {
149 while (1) {
150 switch (_context.prev = _context.next) {
151 case 0:
152 result = seed;
153
154 case 1:
155 if (!true) {
156 _context.next = 9;
157 break;
158 }
159
160 _context.next = 4;
161 return afn(result);
162
163 case 4:
164 result = _context.sent;
165
166 if (!(result === false)) {
167 _context.next = 7;
168 break;
169 }
170
171 return _context.abrupt('break', 9);
172
173 case 7:
174 _context.next = 1;
175 break;
176
177 case 9:
178 case 'end':
179 return _context.stop();
180 }
181 }
182 }, _callee, _this);
183 })));
184}
185
186function repeatTake(ch, afn, seed) {
187 var _this2 = this;
188
189 go(_asyncToGenerator(regeneratorRuntime.mark(function _callee2() {
190 var result, item;
191 return regeneratorRuntime.wrap(function _callee2$(_context2) {
192 while (1) {
193 switch (_context2.prev = _context2.next) {
194 case 0:
195 result = seed;
196
197 case 1:
198 if (!true) {
199 _context2.next = 12;
200 break;
201 }
202
203 _context2.next = 4;
204 return take(ch);
205
206 case 4:
207 item = _context2.sent;
208 _context2.next = 7;
209 return afn(item, result);
210
211 case 7:
212 result = _context2.sent;
213
214 if (!(result === false)) {
215 _context2.next = 10;
216 break;
217 }
218
219 return _context2.abrupt('break', 12);
220
221 case 10:
222 _context2.next = 1;
223 break;
224
225 case 12:
226 case 'end':
227 return _context2.stop();
228 }
229 }
230 }, _callee2, _this2);
231 })));
232}
233
234function any() {
235 var _this3 = this;
236
237 for (var _len = arguments.length, chs = Array(_len), _key = 0; _key < _len; _key++) {
238 chs[_key] = arguments[_key];
239 }
240
241 var ready = chs.filter(function (ch) {
242 return !ch.buffer.isEmpty();
243 });
244 var format = function format(ch) {
245 return take(ch).then(function (val) {
246 return [val, ch];
247 });
248 };
249
250 if (ready.length === 1) {
251 return format(ready[0]);
252 }
253
254 if (ready.length > 1) {
255 return format(ready[Math.floor(Math.random() * ready.length)]);
256 }
257
258 return new Promise(function (res) {
259 chs.forEach(function (ch) {
260 go(_asyncToGenerator(regeneratorRuntime.mark(function _callee3() {
261 var val;
262 return regeneratorRuntime.wrap(function _callee3$(_context3) {
263 while (1) {
264 switch (_context3.prev = _context3.next) {
265 case 0:
266 _context3.next = 2;
267 return take(ch);
268
269 case 2:
270 val = _context3.sent;
271
272 res([val, ch]);
273 close(ch);
274
275 case 5:
276 case 'end':
277 return _context3.stop();
278 }
279 }
280 }, _callee3, _this3);
281 })));
282 });
283 });
284}
\No newline at end of file