@@ -110,13 +110,12 @@ def self.when(*promises)
110
110
When . new ( promises )
111
111
end
112
112
113
- attr_reader :value , : error, :prev , :next
113
+ attr_reader :error , :prev , :next
114
114
115
- def initialize ( success = nil , failure = nil )
116
- @success = success
117
- @failure = failure
115
+ def initialize ( action = { } )
116
+ @action = action
118
117
119
- @realized = nil
118
+ @realized = false
120
119
@exception = false
121
120
@value = nil
122
121
@error = nil
@@ -126,16 +125,28 @@ def initialize(success = nil, failure = nil)
126
125
@next = nil
127
126
end
128
127
128
+ def value
129
+ if Promise === @value
130
+ @value . value
131
+ else
132
+ @value
133
+ end
134
+ end
135
+
129
136
def act?
130
- @success != nil
137
+ @action . has_key? ( :success ) || @action . has_key? ( :always )
138
+ end
139
+
140
+ def action
141
+ @action . keys
131
142
end
132
143
133
144
def exception?
134
145
@exception
135
146
end
136
147
137
148
def realized?
138
- @realized != nil
149
+ !! @realized
139
150
end
140
151
141
152
def resolved?
@@ -166,8 +177,12 @@ def >>(promise)
166
177
promise . reject ( @delayed [ 0 ] )
167
178
elsif resolved?
168
179
promise . resolve ( @delayed ? @delayed [ 0 ] : value )
169
- elsif rejected? && ( !@failure || Promise === ( @delayed ? @delayed [ 0 ] : @error ) )
170
- promise . reject ( @delayed ? @delayed [ 0 ] : error )
180
+ elsif rejected?
181
+ if !@action . has_key? ( :failure ) || Promise === ( @delayed ? @delayed [ 0 ] : @error )
182
+ promise . reject ( @delayed ? @delayed [ 0 ] : error )
183
+ elsif promise . action . include? ( :always )
184
+ promise . reject ( @delayed ? @delayed [ 0 ] : error )
185
+ end
171
186
end
172
187
173
188
self
@@ -179,17 +194,12 @@ def resolve(value = nil)
179
194
end
180
195
181
196
if Promise === value
182
- value << @prev
183
-
184
- return value ^ self
197
+ return ( value << @prev ) ^ self
185
198
end
186
199
187
- @realized = :resolve
188
- @value = value
189
-
190
200
begin
191
- if @ success
192
- value = @success . call ( value )
201
+ if block = @action [ : success] || @action [ :always ]
202
+ value = block . call ( value )
193
203
end
194
204
195
205
resolve! ( value )
@@ -201,6 +211,9 @@ def resolve(value = nil)
201
211
end
202
212
203
213
def resolve! ( value )
214
+ @realized = :resolve
215
+ @value = value
216
+
204
217
if @next
205
218
@next . resolve ( value )
206
219
else
@@ -214,21 +227,16 @@ def reject(value = nil)
214
227
end
215
228
216
229
if Promise === value
217
- value << @prev
218
-
219
- return value ^ self
230
+ return ( value << @prev ) ^ self
220
231
end
221
232
222
- @realized = :reject
223
- @error = value
224
-
225
233
begin
226
- if @failure
227
- value = @failure . call ( value )
234
+ if block = @action [ :failure ] || @action [ :always ]
235
+ value = block . call ( value )
236
+ end
228
237
229
- if Promise === value
230
- reject! ( value )
231
- end
238
+ if @action . has_key? ( :always )
239
+ resolve! ( value )
232
240
else
233
241
reject! ( value )
234
242
end
@@ -240,6 +248,9 @@ def reject(value = nil)
240
248
end
241
249
242
250
def reject! ( value )
251
+ @realized = :reject
252
+ @error = value
253
+
243
254
if @next
244
255
@next . reject ( value )
245
256
else
@@ -258,7 +269,7 @@ def then(&block)
258
269
raise ArgumentError , 'a promise has already been chained'
259
270
end
260
271
261
- self ^ Promise . new ( block )
272
+ self ^ Promise . new ( success : block )
262
273
end
263
274
264
275
alias do then
@@ -268,7 +279,7 @@ def fail(&block)
268
279
raise ArgumentError , 'a promise has already been chained'
269
280
end
270
281
271
- self ^ Promise . new ( nil , block )
282
+ self ^ Promise . new ( failure : block )
272
283
end
273
284
274
285
alias rescue fail
@@ -279,7 +290,7 @@ def always(&block)
279
290
raise ArgumentError , 'a promise has already been chained'
280
291
end
281
292
282
- self ^ Promise . new ( block , block )
293
+ self ^ Promise . new ( always : block )
283
294
end
284
295
285
296
alias finally always
@@ -311,11 +322,11 @@ def inspect
311
322
312
323
class Trace < self
313
324
def self . it ( promise )
314
- unless promise . realized?
315
- raise ArgumentError , "the promise hasn't been realized"
316
- end
325
+ current = [ ]
317
326
318
- current = promise . act? ? [ promise . value ] : [ ]
327
+ if promise . act? || promise . prev . nil?
328
+ current . push ( promise . value )
329
+ end
319
330
320
331
if prev = promise . prev
321
332
current . concat ( it ( prev ) )
@@ -327,8 +338,9 @@ def self.it(promise)
327
338
def initialize ( depth , block )
328
339
@depth = depth
329
340
330
- super -> {
341
+ super success : -> {
331
342
trace = Trace . it ( self ) . reverse
343
+ trace . pop
332
344
333
345
if depth && depth <= trace . length
334
346
trace . shift ( trace . length - depth )
0 commit comments