SHOW:
|
|
- or go back to the newest paste.
1 | use v6; | |
2 | use Test; | |
3 | ||
4 | class Promise { | |
5 | enum STATE <PENDING FULFILLED REJECTED>; | |
6 | ||
7 | has STATE $.state = STATE::PENDING; | |
8 | has %!do-actions; | |
9 | has $!reject-reason; | |
10 | has $!fulfill-value; | |
11 | ||
12 | method fulfill($val!) { | |
13 | if $!state != STATE::FULFILLED { | |
14 | $!state = STATE::FULFILLED; | |
15 | $!fulfill-value = $val; | |
16 | - | for %!do-actions<fulfill> -> $f { |
16 | + | for %!do-actions<fulfill>[] -> $f { |
17 | $f($!fulfill-value); | |
18 | } | |
19 | } | |
20 | } | |
21 | method reject($reason!) { | |
22 | if $!state != STATE::REJECTED { | |
23 | $!state = STATE::REJECTED; | |
24 | $!reject-reason = $reason; | |
25 | - | for %!do-actions<reject> -> $r { |
25 | + | for %!do-actions<reject>[] -> $r { |
26 | $r[0]($!reject-reason); | |
27 | } | |
28 | } | |
29 | } | |
30 | ||
31 | method then(&on-fulfill, &on-reject?) { | |
32 | if $!state == STATE::PENDING { | |
33 | %!do-actions<fulfill>.push: { &on-fulfill } if &on-fulfill; | |
34 | %!do-actions<reject>.push: { &on-reject } if &on-reject; | |
35 | } elsif $!state == STATE::REJECTED { | |
36 | %!do-actions<reject>.map: { &on-reject($!reject-reason) }; | |
37 | } else { | |
38 | %!do-actions<fulfill>.map: { &on-fulfill($!fulfill-value) }; | |
39 | } | |
40 | return self; | |
41 | } | |
42 | } | |
43 | ||
44 | { | |
45 | my $promise = Promise.new; | |
46 | ||
47 | my $value = 0; | |
48 | $promise.then(sub ($arg) { $value = $arg }); | |
49 | ok !$value, "Hasn't been fulfilled yet"; | |
50 | ||
51 | $promise.fulfill("OH HAI"); | |
52 | ||
53 | is $promise.state, Promise::STATE::FULFILLED, "Correct state"; | |
54 | is $value, "OH HAI", "Code has been run"; | |
55 | } | |
56 | ||
57 | { | |
58 | my $promise = Promise.new(state => Promise::STATE::FULFILLED, | |
59 | value => "yay!"); | |
60 | is $promise.state, Promise::STATE::FULFILLED, "Already correct state"; | |
61 | ||
62 | my $value = 0; | |
63 | $promise.then(sub ($arg) { $value = $arg }); | |
64 | ||
65 | is $value, "yay!", "Code ran immediately"; | |
66 | } | |
67 | ||
68 | { | |
69 | my $promise = Promise.new; | |
70 | ||
71 | my $value = 0; | |
72 | my $reason = 0; | |
73 | $promise.then(sub ($arg) { $value = $arg }, | |
74 | sub ($arg) { $reason = $arg }); | |
75 | ok !$reason, "Hasn't been rejected yet"; | |
76 | ||
77 | $promise.reject("OH NOES"); | |
78 | ||
79 | is $promise.state, Promise::STATE::REJECTED, "Correct state"; | |
80 | ok !$value, "Fulfill code didn't run"; | |
81 | is $reason, "OH NOES", "Reject code has been run"; | |
82 | } | |
83 | ||
84 | done; |