Skip to content

Instantly share code, notes, and snippets.

@masak
Forked from labster/PROMISE.pl
Last active December 18, 2015 17:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save masak/5818409 to your computer and use it in GitHub Desktop.
Save masak/5818409 to your computer and use it in GitHub Desktop.
use strict;
use warnings;
use feature 'say';
package Promise {
sub state {
return shift->{'state'};
}
sub fulfill {
my ($self, $fulfillvalue) = @_;
return
unless $self->state eq 'PENDING';
$self->{'fulfillvalue'} = $fulfillvalue;
$self->{'state'} = 'FULFILLED';
for my $onFulfilled (@{$self->{'fulfillqueue'}}) {
$onFulfilled->($fulfillvalue);
}
return;
}
sub reject {
my ($self, $rejectreason) = @_;
return
unless $self->state eq 'PENDING';
$self->{'rejectreason'} = $rejectreason;
$self->{'state'} = 'REJECTED';
return;
}
sub then {
my ($self, $onFulfilled, $onRejected) = @_;
if ($self->state eq 'PENDING') {
push @{$self->{'fulfillqueue'}}, $onFulfilled if defined $onFulfilled;
# push @rejectqueue, $onRejected if defined $onRejected;
$self->{'rejrun'} = $onRejected;
$self->{'fulrun'} = $onFulfilled;
#$self->{'fulrun'}("foo");
}
elsif ($self->state eq 'FULFILLED') {
$self->{'fulrun'}($self->{'fulfillvalue'});
# for my $onFulfilled (@fulfillqueue) {
# $onFulfilled->($fulfillvalue);
# }
}
else {
$self->{'rejrun'}->($self->{'rejectreason'});
# for my $onRejected (@rejectqueue) {
# $onRejected->($rejectreason);
# }
}
}
sub new {
my $class = shift;
my %opts = @_;
$opts{'state'} //= 'PENDING';
$opts{'value'} //= '';
$opts{'fulfillqueue'} //= [];
$opts{'rejectqueue'} //= [];
return bless \%opts, $class;
}
}
use Test::More tests => 12;
{
my $promise = Promise->new;
my $value = 0;
$promise->then(sub { $value = shift });
ok !$value, "Hasn't been fulfilled yet";
$promise->fulfill("OH HAI");
is $promise->state, "FULFILLED", "Correct state";
is $value, "OH HAI", "Code has been run";
}
{
my $promise = Promise->new(state => "FULFILLED", value => "yay!");
is $promise->state, "FULFILLED", "Already correct state";
my $value = 0;
$promise->then(sub { $value = shift });
is $value, "yay!", "Code ran immediately";
}
{
my $promise = Promise->new;
my $value = 0;
my $reason = 0;
$promise->then(sub { $value = shift }, sub { $reason = shift });
ok !$reason, "Hasn't been rejected yet";
$promise->reject("OH NOES");
is $promise->state, "REJECTED", "Correct state";
ok !$value, "Fulfill code didn't run";
is $reason, "OH NOES", "Reject code has been run";
}
{
my $promise = Promise->new;
my $value = 0;
$promise->then(sub { $value++ });
$promise->then(sub { $value++ });
$promise->then(sub { $value++ });
ok !$value, "Hasn't been fulfilled yet";
$promise->fulfill("OH HAI");
is $promise->state, "FULFILLED", "Correct state";
is $value, 3, "Code has been run";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment