corrade-nucleus-nucleons – Blame information for rev 20
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
20 | office | 1 | "use strict"; |
2 | module.exports = |
||
3 | function(Promise, PromiseArray, apiRejection) { |
||
4 | var util = require("./util"); |
||
5 | var RangeError = require("./errors").RangeError; |
||
6 | var AggregateError = require("./errors").AggregateError; |
||
7 | var isArray = util.isArray; |
||
8 | var CANCELLATION = {}; |
||
9 | |||
10 | |||
11 | function SomePromiseArray(values) { |
||
12 | this.constructor$(values); |
||
13 | this._howMany = 0; |
||
14 | this._unwrap = false; |
||
15 | this._initialized = false; |
||
16 | } |
||
17 | util.inherits(SomePromiseArray, PromiseArray); |
||
18 | |||
19 | SomePromiseArray.prototype._init = function () { |
||
20 | if (!this._initialized) { |
||
21 | return; |
||
22 | } |
||
23 | if (this._howMany === 0) { |
||
24 | this._resolve([]); |
||
25 | return; |
||
26 | } |
||
27 | this._init$(undefined, -5); |
||
28 | var isArrayResolved = isArray(this._values); |
||
29 | if (!this._isResolved() && |
||
30 | isArrayResolved && |
||
31 | this._howMany > this._canPossiblyFulfill()) { |
||
32 | this._reject(this._getRangeError(this.length())); |
||
33 | } |
||
34 | }; |
||
35 | |||
36 | SomePromiseArray.prototype.init = function () { |
||
37 | this._initialized = true; |
||
38 | this._init(); |
||
39 | }; |
||
40 | |||
41 | SomePromiseArray.prototype.setUnwrap = function () { |
||
42 | this._unwrap = true; |
||
43 | }; |
||
44 | |||
45 | SomePromiseArray.prototype.howMany = function () { |
||
46 | return this._howMany; |
||
47 | }; |
||
48 | |||
49 | SomePromiseArray.prototype.setHowMany = function (count) { |
||
50 | this._howMany = count; |
||
51 | }; |
||
52 | |||
53 | SomePromiseArray.prototype._promiseFulfilled = function (value) { |
||
54 | this._addFulfilled(value); |
||
55 | if (this._fulfilled() === this.howMany()) { |
||
56 | this._values.length = this.howMany(); |
||
57 | if (this.howMany() === 1 && this._unwrap) { |
||
58 | this._resolve(this._values[0]); |
||
59 | } else { |
||
60 | this._resolve(this._values); |
||
61 | } |
||
62 | return true; |
||
63 | } |
||
64 | return false; |
||
65 | |||
66 | }; |
||
67 | SomePromiseArray.prototype._promiseRejected = function (reason) { |
||
68 | this._addRejected(reason); |
||
69 | return this._checkOutcome(); |
||
70 | }; |
||
71 | |||
72 | SomePromiseArray.prototype._promiseCancelled = function () { |
||
73 | if (this._values instanceof Promise || this._values == null) { |
||
74 | return this._cancel(); |
||
75 | } |
||
76 | this._addRejected(CANCELLATION); |
||
77 | return this._checkOutcome(); |
||
78 | }; |
||
79 | |||
80 | SomePromiseArray.prototype._checkOutcome = function() { |
||
81 | if (this.howMany() > this._canPossiblyFulfill()) { |
||
82 | var e = new AggregateError(); |
||
83 | for (var i = this.length(); i < this._values.length; ++i) { |
||
84 | if (this._values[i] !== CANCELLATION) { |
||
85 | e.push(this._values[i]); |
||
86 | } |
||
87 | } |
||
88 | if (e.length > 0) { |
||
89 | this._reject(e); |
||
90 | } else { |
||
91 | this._cancel(); |
||
92 | } |
||
93 | return true; |
||
94 | } |
||
95 | return false; |
||
96 | }; |
||
97 | |||
98 | SomePromiseArray.prototype._fulfilled = function () { |
||
99 | return this._totalResolved; |
||
100 | }; |
||
101 | |||
102 | SomePromiseArray.prototype._rejected = function () { |
||
103 | return this._values.length - this.length(); |
||
104 | }; |
||
105 | |||
106 | SomePromiseArray.prototype._addRejected = function (reason) { |
||
107 | this._values.push(reason); |
||
108 | }; |
||
109 | |||
110 | SomePromiseArray.prototype._addFulfilled = function (value) { |
||
111 | this._values[this._totalResolved++] = value; |
||
112 | }; |
||
113 | |||
114 | SomePromiseArray.prototype._canPossiblyFulfill = function () { |
||
115 | return this.length() - this._rejected(); |
||
116 | }; |
||
117 | |||
118 | SomePromiseArray.prototype._getRangeError = function (count) { |
||
119 | var message = "Input array must contain at least " + |
||
120 | this._howMany + " items but contains only " + count + " items"; |
||
121 | return new RangeError(message); |
||
122 | }; |
||
123 | |||
124 | SomePromiseArray.prototype._resolveEmptyArray = function () { |
||
125 | this._reject(this._getRangeError(0)); |
||
126 | }; |
||
127 | |||
128 | function some(promises, howMany) { |
||
129 | if ((howMany | 0) !== howMany || howMany < 0) { |
||
130 | return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a"); |
||
131 | } |
||
132 | var ret = new SomePromiseArray(promises); |
||
133 | var promise = ret.promise(); |
||
134 | ret.setHowMany(howMany); |
||
135 | ret.init(); |
||
136 | return promise; |
||
137 | } |
||
138 | |||
139 | Promise.some = function (promises, howMany) { |
||
140 | return some(promises, howMany); |
||
141 | }; |
||
142 | |||
143 | Promise.prototype.some = function (howMany) { |
||
144 | return some(this, howMany); |
||
145 | }; |
||
146 | |||
147 | Promise._SomePromiseArray = SomePromiseArray; |
||
148 | }; |