GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
Venus::Future(3) User Contributed Perl Documentation Venus::Future(3)

Venus::Future - Future Class

Future Class for Perl 5

  package main;
  use Venus::Future;
  my $future = Venus::Future->new;
  # bless({...}, 'Venus::Future')
  # $future->promise(sub{
  #   my ($resolve, $reject) = @_;
  #   $resolve->result(1);
  # });
  # bless({...}, 'Venus::Future')
  # $future->fulfill;
  # true

This package provides a framework-agnostic "Future" and implementation of the "Promise/A+" pattern for asynchronous programming. The futures are non-blocking and support "suspend" and "resume" allowing them to be used in any asynchronous operating environment.

This package inherits behaviors from:

Venus::Kind::Utility

This package integrates behaviors from:

Venus::Role::Buildable

This package provides the following methods:

  catch(coderef $on_reject) (Venus::Future)

The catch method registers a rejection handler and returns the future that invokes the handlers.

Since 3.55

catch example 1
  # given: synopsis
  package main;
  my $catch = $future->catch(sub{
    my ($issue) = @_;
    return $issue;
  });
  # bless(..., "Venus::Future")
  # $catch->then(sub{...});
  # bless(..., "Venus::Future")
    
catch example 2
  # given: synopsis
  package main;
  my $catch = $future->catch(sub{
    my ($issue) = @_;
    return $issue;
  });
  # bless(..., "Venus::Future")
  $future = $future;
  # bless(..., "Venus::Future")
  # $future->reject('Oops!');
  # bless(..., "Venus::Future")
    

  finally(coderef $on_finally) (Venus::Future)

The finally method registers a finally handler and returns the future that invokes the handlers.

Since 3.55

finally example 1
  # given: synopsis
  package main;
  my $finally = $future->finally(sub{
    my ($data) = @_;
    return $data;
  });
  # bless(..., "Venus::Future")
  # $finally->then(sub{...});
  # bless(..., "Venus::Future")
    
finally example 2
  # given: synopsis
  package main;
  $future->then(sub{
    $_
  });
  my $finally = $future->finally(sub{
    my ($data) = @_;
    $future->{stash} = $data;
    return $data;
  });
  # bless(..., "Venus::Future")
  $future = $future;
  # bless(..., "Venus::Future")
  # $future->resolve('Hello.');
  # bless(..., "Venus::Future")
    
finally example 3
  # given: synopsis
  package main;
  $future->then(sub{
    $_
  });
  my $finally = $future->finally(sub{
    my ($data) = @_;
    $future->{stash} = $data;
    return $data;
  });
  # bless(..., "Venus::Future")
  $future = $future;
  # bless(..., "Venus::Future")
  # $future->reject('Oops!');
  # bless(..., "Venus::Future")
    

  fulfill() (Venus::Future)

The fulfill method attempts to fulfill the promise by actuating it, or resuming a previously actuated promise, and returns true if the future has been resolved, i.e. the future is either is_fulfilled or is_rejected, and otherwise returns false.

Since 3.55

fulfill example 1
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[0]->result;
  });
  my $fulfilled = $future->fulfill;
  # true
    
fulfill example 2
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[0]->result;
  });
  $future->fulfill;
  my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_fulfilled;
  # true
  # $result->value;
  # undef
    
fulfill example 3
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[1]->result;
  });
  my $fulfilled = $future->fulfill;
  # true
    
fulfill example 4
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[1]->result;
  });
  $future->fulfill;
  my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_rejected;
  # true
  # $result->issue;
  # undef
    
fulfill example 5
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[0]->result(1);
  })->then(sub{
    return $future->{stash} = $_ * 2; # 2
  })->then(sub{
    return $future->{stash} = $_ * 2; # 4
  })->then(sub{
    return $future->{stash} = $_ * 2; # 8
  });
  $future->fulfill;
  my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_fulfilled;
  # true
  # $result->value;
  # 1
    
fulfill example 6
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[0]->result(1);
  });
  $future->then(sub{
    return $future->{stash} = $_ * 2; # 2
  });
  $future->then(sub{
    return $future->{stash} = $_ * 2; # 2
  });
  $future->then(sub{
    return $future->{stash} = $_ * 2; # 2
  });
  $future->fulfill;
  my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_fulfilled;
  # true
  # $result->value;
  # 1
    
fulfill example 7
  # given: synopsis
  package main;
  my $pending_future = Venus::Future->new;
  $future->promise(sub{
    # resolve
    $_[0]->result(1);
  })->then(sub{
    return $_
  })->then(sub{
    return $pending_future;
  })->then(sub{
    return $_
  });
  $future->fulfill;
  my @results = ($future, $pending_future);
  # my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_fulfilled;
  # false
  # $result->is_pending;
  # true
  # $result->value;
  # undef
  # $pending_future->resolve(0);
  # bless(..., "Venus::Future")
  # $pending_future->is_fulfilled;
  # true
  # $result->fulfill;
  # true
  # $result->is_fulfilled;
  # true
    
fulfill example 8
  # given: synopsis
  package Thenable;
  use Venus::Class;
  sub then {
    my ($self, $resolve, $reject) = @_;
    $resolve->(100);
  }
  package main;
  my $thenable_object = Thenable->new;
  $future->promise(sub{
    # resolve
    $_[0]->result(1);
  })->then(sub{
    return $_
  })->then(sub{
    return $thenable_object;
  })->then(sub{
    return $future->{stash} = $_
  });
  $future->fulfill;
  my @results = ($future, $thenable_object);
  # my $result = $future;
  # bless(..., "Venus::Future")
  # $result->is_fulfilled;
  # true
  # $result->value;
  # 1
    

  is(string $name) (boolean)

The is method take a name and dispatches to the corresponding "is_$name" method and returns the result.

Since 3.55

is example 1
  # given: synopsis
  package main;
  $future->resolve;
  my $is_fulfilled = $future->is('fulfilled');
  # true
    
is example 2
  # given: synopsis
  package main;
  my $is_pending = $future->is('pending');
  # true
    
is example 3
  # given: synopsis
  package main;
  $future->reject;
  my $is_rejected = $future->is('rejected');
  # true
    

  is_fulfilled() (boolean)

The is_fulfilled method returns true if the future has been fulfilled, otherwise returns false.

Since 3.55

is_fulfilled example 1
  # given: synopsis
  package main;
  my $is_fulfilled = $future->is_fulfilled;
  # false
    
is_fulfilled example 2
  # given: synopsis
  package main;
  $future->resolve;
  my $is_fulfilled = $future->is_fulfilled;
  # true
    
is_fulfilled example 3
  # given: synopsis
  package main;
  $future->reject;
  my $is_fulfilled = $future->is_fulfilled;
  # false
    

  is_pending() (boolean)

The is_pending method returns true if the future has remained pending, otherwise returns false.

Since 3.55

is_pending example 1
  # given: synopsis
  package main;
  my $is_pending = $future->is_pending;
  # true
    
is_pending example 2
  # given: synopsis
  package main;
  $future->resolve;
  my $is_pending = $future->is_pending;
  # false
    
is_pending example 3
  # given: synopsis
  package main;
  $future->reject;
  my $is_pending = $future->is_pending;
  # false
    

  is_promised() (boolean)

The is_promised method returns true if the future a registered promise, otherwise returns false.

Since 3.55

is_promised example 1
  # given: synopsis
  package main;
  my $is_promised = $future->is_promised;
  # false
    
is_promised example 2
  # given: synopsis
  package main;
  $future->promise;
  my $is_promised = $future->is_promised;
  # false
    
is_promised example 3
  # given: synopsis
  package main;
  $future->promise(sub{$_[0]->result});
  my $is_promised = $future->is_promised;
  # true
    

  is_rejected() (boolean)

The is_rejected method returns true if the future has been rejected, otherwise returns false.

Since 3.55

is_rejected example 1
  # given: synopsis
  package main;
  my $is_rejected = $future->is_rejected;
  # false
    
is_rejected example 2
  # given: synopsis
  package main;
  $future->resolve;
  my $is_rejected = $future->is_rejected;
  # false
    
is_rejected example 3
  # given: synopsis
  package main;
  $future->reject;
  my $is_rejected = $future->is_rejected;
  # true
    

  issue() (any)

The issue method returns the result of the "reject" operation once the future has been rejected.

Since 3.55

issue example 1
  # given: synopsis
  package main;
  my $issue = $future->issue;
  # undef
  # $future->is_pending
  # true
    
issue example 2
  # given: synopsis
  package main;
  $future->reject(0);
  my $issue = $future->issue;
  # 0
  # $future->is_rejected
  # true
    
issue example 3
  # given: synopsis
  package main;
  $future->reject({fail => 1});
  my $issue = $future->issue;
  # {fail => 1}
  # $future->is_rejected
  # true
    

  new(any @args) (Venus::Future)

The new method instantiates this package and returns a new instance.

Since 3.55

new example 1
  package main;
  my $future = Venus::Future->new;
  # bless(..., "Venus::Future")
    
new example 2
  package main;
  my $future = Venus::Future->new(sub{
    my ($resolve, $reject) = @_;
    $resolve->result('okay');
  });
  # bless(..., "Venus::Future")
  # $future->is('fulfilled');
  # true
  # $future->value;
  # 'okay'
    
new example 3
  package main;
  my $future = Venus::Future->new(promise => sub{
    my ($resolve, $reject) = @_;
    $reject->result('boom');
  });
  # bless(..., "Venus::Future")
  # $future->is('rejected');
  # true
  # $future->issue;
  # 'boom'
    

  promise(coderef $code) (Venus::Future)

The promise method registers a callback executed by the "fulfill" method, which is provided two arguments; the first argument being a Venus::Try instance representing a "resolve" operaiton; the second argument being a Venus::Try instance representing a "reject" operaiton; and returns the invocant.

Since 3.55

promise example 1
  # given: synopsis
  package main;
  $future = $future->promise(sub{
    my ($resolve, $reject) = @_;
    $resolve->result('pass');
  });
  # bless(..., "Venus::Future")
  # $future->fulfill;
  # true
    
promise example 2
  # given: synopsis
  package main;
  $future = $future->promise(sub{
    my ($resolve, $reject) = @_;
    $reject->result('fail');
  });
  # bless(..., "Venus::Future")
  # $future->fulfill;
  # true
    

  reject(any $issue) (Venus::Future)

The reject method cascades a rejection operation causes the future to be rejected, and returns the invocant.

Since 3.55

reject example 1
  # given: synopsis
  package main;
  my $rejected = $future->reject;
  # bless(..., "Venus::Future")
  # $rejected->status
  # "rejected"
  # $rejected->issue
  # undef
    
reject example 2
  # given: synopsis
  package main;
  my $rejected = $future->reject('Oops!');
  # bless(..., "Venus::Future")
  # $rejected->status
  # "rejected"
  # $rejected->issue
  # "Oops!"
    

  resolve(any $value) (Venus::Future)

The resolve method cascades a rejection operation causes the future to be rejected, and returns the invocant.

Since 3.55

resolve example 1
  # given: synopsis
  package main;
  my $fulfilled = $future->resolve;
  # bless(..., "Venus::Future")
  # $fulfilled->status
  # "fulfilled"
  # $fulfilled->value
  # undef
    
resolve example 2
  # given: synopsis
  package main;
  my $fulfilled = $future->resolve('Great!');
  # bless(..., "Venus::Future")
  # $fulfilled->status
  # "fulfilled"
  # $fulfilled->value
  # "Great!"
    

  status() (any)

The status method returns the status of the future. Valid statuses are "fulfilled", "pending", and "rejected".

Since 3.55

status example 1
  # given: synopsis
  package main;
  my $status = $future->status;
  # "pending"
    
status example 2
  # given: synopsis
  package main;
  $future->resolve(0);
  my $status = $future->status;
  # "fulfilled"
    
status example 3
  # given: synopsis
  package main;
  $future->reject(0);
  my $status = $future->status;
  # "rejected"
    

  then(coderef $fulfill, coderef $reject) (Venus::Future)

The then method registers fulfillment and rejection handlers and returns the future that invokes the handlers.

Since 3.55

then example 1
  # given: synopsis
  package main;
  my $new_future = $future->then(sub{
    # fulfillment handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    
then example 2
  # given: synopsis
  package main;
  my $new_future = $future->then(sub{
    # fulfillment handler
    $_
  },
  sub{
    # rejection handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    
then example 3
  # given: synopsis
  package main;
  my $new_future = $future->then(undef, sub{
    # rejection handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    
then example 4
  # given: synopsis
  package main;
  my $new_future = $future->then(sub{
    # fulfillment handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
  $future = $future;
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    
then example 5
  # given: synopsis
  package main;
  my $new_future = $future->then(sub{
    # fulfillment handler
    $_
  },
  sub{
    # rejection handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
  $future = $future;
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    
then example 6
  # given: synopsis
  package main;
  my $new_future = $future->then(undef, sub{
    # rejection handler
    $_
  });
  # "Venus::Future"
  # $new_future->is_pending;
  # true
  $future = $future;
  # "Venus::Future"
  # $new_future->is_pending;
  # true
    

  value() (any)

The value method returns the result of the "resolve" operation once the future has been fulfilled.

Since 3.55

value example 1
  # given: synopsis
  package main;
  my $value = $future->value;
  # undef
  # $future->is_pending
  # true
    
value example 2
  # given: synopsis
  package main;
  $future->resolve(1);
  my $value = $future->value;
  # 1
  # $future->is_fulfilled
  # true
    
value example 3
  # given: synopsis
  package main;
  $future->resolve({pass => 1});
  my $value = $future->value;
  # {pass => 1}
  # $future->is_fulfilled
  # true
    

  wait(number $timeout) (Venus::Future)

The wait method blocks the execution of the current process until a value is received. If a timeout is provided, execution will be blocked until a value is received or the wait time expires. If a timeout of 0 is provided, execution will not be blocked. If no timeout is provided at all, execution will block indefinitely.

Since 3.55

wait example 1
  # given: synopsis
  package main;
  $future->promise(sub{
    # resolve
    $_[0]->result;
  });
  $future = $future->wait(0);
  # bless(..., "Venus::Future")
  # $future->is_fulfilled;
  # true
    
wait example 2
  # given: synopsis
  package main;
  $future->promise(sub{
    # never fulfilled
  });
  $future->wait(1);
  # Exception! (isa Venus::Future::Error) (see error_on_timeout)
    

This package may raise the following errors:

This package may raise an error_on_timeout exception.

example 1

  # given: synopsis;
  my $input = {
    throw => 'error_on_timeout',
    timeout => 10,
  };
  my $error = $future->try('error', $input)->error->result;
  # my $name = $error->name;
  # "on_timeout"
  # my $message = $error->render;
  # "Future timed-out after 10 seconds"
  # my $timeout = $error->stash('timeout');
  # 10
    

Awncorp, "awncorp@cpan.org"

Copyright (C) 2022, Awncorp, "awncorp@cpan.org".

This program is free software, you can redistribute it and/or modify it under the terms of the Apache license version 2.0.

2023-11-27 perl v5.40.2

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.