UNPKG

2.39 kBJavaScriptView Raw
1'use strict';
2var $ = require('../internals/export');
3var call = require('../internals/function-call');
4var aCallable = require('../internals/a-callable');
5var anObject = require('../internals/an-object');
6var isObject = require('../internals/is-object');
7var getIteratorDirect = require('../internals/get-iterator-direct');
8var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
9var createIterResultObject = require('../internals/create-iter-result-object');
10var closeAsyncIteration = require('../internals/async-iterator-close');
11var IS_PURE = require('../internals/is-pure');
12
13var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
14 var state = this;
15 var iterator = state.iterator;
16 var predicate = state.predicate;
17
18 return new Promise(function (resolve, reject) {
19 var doneAndReject = function (error) {
20 state.done = true;
21 reject(error);
22 };
23
24 var ifAbruptCloseAsyncIterator = function (error) {
25 closeAsyncIteration(iterator, doneAndReject, error, doneAndReject);
26 };
27
28 var loop = function () {
29 try {
30 Promise.resolve(anObject(call(state.next, iterator))).then(function (step) {
31 try {
32 if (anObject(step).done) {
33 state.done = true;
34 resolve(createIterResultObject(undefined, true));
35 } else {
36 var value = step.value;
37 try {
38 var result = predicate(value, state.counter++);
39
40 var handler = function (selected) {
41 selected ? resolve(createIterResultObject(value, false)) : loop();
42 };
43
44 if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
45 else handler(result);
46 } catch (error3) { ifAbruptCloseAsyncIterator(error3); }
47 }
48 } catch (error2) { doneAndReject(error2); }
49 }, doneAndReject);
50 } catch (error) { doneAndReject(error); }
51 };
52
53 loop();
54 });
55});
56
57// `AsyncIterator.prototype.filter` method
58// https://github.com/tc39/proposal-async-iterator-helpers
59$({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, {
60 filter: function filter(predicate) {
61 anObject(this);
62 aCallable(predicate);
63 return new AsyncIteratorProxy(getIteratorDirect(this), {
64 predicate: predicate
65 });
66 }
67});