File Coverage

blib/lib/Promises6/Deferred.pm
Criterion Covered Total %
statement 71 71 100.0
branch 29 48 60.4
condition n/a
subroutine 11 11 100.0
pod 9 9 100.0
total 120 139 86.3


line stmt bran cond sub pod time code
1             package Promises6::Deferred;
2 30     30   10773 use Evo::Base -base;
  30         41  
  30         228  
3 30     30   6152 use Promises6::Util ':all';
  30         46  
  30         22434  
4              
5             # [state, val]
6             has [qw(result builder)];
7             has subscribers => sub { [] };
8             has 'is_adaptor';
9              
10             # public methods -----------
11 266 50   266 1 1772 sub promise($self) { $self->builder->promise(deferred => $self) }
  266 50       460  
  266         261  
  266         217  
  266         4907  
12              
13 232 50   232 1 4452 sub resolve($self, $val) {
  232 50       455  
  232         231  
  232         239  
  232         195  
14 232 100       4192 return if $self->is_adaptor;
15 230         4440 $self->builder->resolver->resolve($self, $val);
16 230         909 $self;
17             }
18              
19             # don't try to resolve
20 49 50   49 1 989 sub reject($self, $reason) {
  49 50       117  
  49         65  
  49         58  
  49         59  
21 49 100       906 return if $self->is_adaptor;
22 47         336 $self->change_state(REJECTED, $reason);
23 47         137 $self;
24             }
25              
26 29 50   29 1 417 sub notify($self, $val) {
  29 50       57  
  29         29  
  29         27  
  29         24  
27 29 50       44 $self->state eq PENDING && $self->broadcast(PROGRESS, $val);
28             }
29              
30             # implementation methods -----------
31 483 50   483 1 975 sub state($self) { $self->result or return PENDING; $self->result->[0] }
  483 50       745  
  483 100       430  
  483         361  
  483         8052  
  72         1306  
32              
33 248 50   248 1 750 sub change_state($self, $state, $val) {
  248 50       394  
  248         245  
  248         229  
  248         598  
  248         203  
34 248 100       440 return unless $self->state == PENDING;
35 237         4842 $self->result([$state, $val])->broadcast($state, $val);
36              
37             # prevent future errors, don't do delete $self->{subscribers}
38 237         16801 $self->{subscribers} = 0;
39 237         614 $self;
40             }
41              
42 266 50   266 1 1762 sub broadcast($self, $state, $val) {
  266 50       447  
  266         263  
  266         227  
  266         238  
  266         212  
43 266         4039 $self->send_msg($_, $state, $val) for $self->subscribers->@*;
44             }
45              
46              
47             # you can use loop here
48 173 50   173 1 464 sub send_msg($self, $listener, $state, $val) {
  173 50       314  
  173         194  
  173         166  
  173         166  
  173         185  
  173         145  
49 173         487 $listener->get_msg($state, $val);
50             }
51              
52 156 50   156 1 1182 sub subscribe($self, $listener) {
  156 50       286  
  156         170  
  156         143  
  156         146  
53 156 100       320 return push $self->subscribers->@*, $listener if $self->state eq PENDING;
54              
55             # already resolved
56 37         710 $self->send_msg($listener, $self->result->@*);
57             }
58              
59             1;
60              
61             __END__