Skip to content

Instantly share code, notes, and snippets.

@labster
Last active December 18, 2015 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save labster/5817793 to your computer and use it in GitHub Desktop.
Save labster/5817793 to your computer and use it in GitHub Desktop.
use strict;
use warnings;
use feature 'say';
package Promise {
my $STATE; # = 'PENDING';
my $fulfillvalue;
my $rejectreason;
my @fulfillqueue;
my @rejectqueue;
my $rejrun;
my $fulrun;
sub state { return $STATE; }
sub fulfill {
return unless $STATE eq 'PENDING';
my $class = shift;
$fulfillvalue = shift;
$STATE = 'FULFILLED';
}
sub reject {
return unless $STATE eq 'PENDING';
my $class = shift;
$rejectreason = shift;
$STATE = 'REJECTED';
}
sub then {
if ($STATE eq 'PENDING') {
my $class = shift;
my $onFulfilled = shift // undef;
my $onRejected = shift // undef;
# push @fulfillqueue, $onFulfilled if defined $onFulfilled;
# push @rejectqueue, $onRejected if defined $onRejected;
$rejrun = $onRejected;
$fulrun = $onFulfilled;
#$fulrun->("foo");
}
elsif ($STATE eq 'FULFILLED') {
$fulrun->($fulfillvalue);
# for my $onFulfilled (@fulfillqueue) {
# $onFulfilled->($fulfillvalue);
# }
}
else {
$rejrun->($rejectreason);
# for my $onRejected (@rejectqueue) {
# $onRejected->($rejectreason);
# }
}
}
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
my %opts = @_;
$STATE = $opts{'state'} // 'PENDING';
$fulfillvalue = $opts{'value'} // '';
$rejectreason = $opts{'reason'} // '';
return $self;
}
}
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