Class: Concurrent::Edge::Future
- Defined in:
- lib/concurrent/edge/future.rb
Overview
Represents a value which will become available in future. May fail with a reason instead.
Direct Known Subclasses
Instance Method Summary collapse
-
#any(*futures) ⇒ Future
(also: #|)
Which has first completed value from futures.
- #chain_completable(completable_future) ⇒ Object (also: #tangle)
-
#delay ⇒ Future
Inserts delay into the chain of Futures making rest of it lazy evaluated.
- #exception(*args) ⇒ Object
-
#failed?(state = internal_state) ⇒ Boolean
Has Future been failed?.
-
#flat(level = 1) ⇒ Object
zips with the Future in the value.
- #fulfilled? ⇒ Boolean
-
#on_failure(executor = nil) {|reason| ... } ⇒ Object
Self.
-
#on_failure! {|reason| ... } ⇒ Object
Self.
-
#on_success(executor = nil) {|value| ... } ⇒ Object
Self.
-
#on_success! {|value| ... } ⇒ Object
Self.
-
#reason(timeout = nil) ⇒ Exception?
The reason of the Future’s failure.
- #rejected? ⇒ Boolean
- #rescue(executor = nil) {|reason| ... } ⇒ Future
-
#result(timeout = nil) ⇒ Array(Boolean, Object, Exception)?
Triplet of success, value, reason.
-
#schedule(intended_time) ⇒ Future
Schedules rest of the chain for execution with specified time or on specified time.
- #state ⇒ :pending, ...
-
#success?(state = internal_state) ⇒ Boolean
Has Future been success?.
- #then(executor = nil) {|value| ... } ⇒ Future
-
#then_ask(actor) ⇒ Future
Asks the actor with its value.
- #then_put(channel) ⇒ Object
-
#then_select(*channels) ⇒ Future
Zips with selected value form the suplied channels.
-
#value(timeout = nil) ⇒ Object?
The value of the Future when success, nil on timeout.
-
#value!(timeout = nil) ⇒ Object?
Wait until Future is #complete?.
-
#wait!(timeout = nil) ⇒ Event, ...
Wait until Future is #complete?.
-
#with_default_executor(executor) ⇒ Future
Changes default executor for rest of the chain.
-
#zip(other) ⇒ Future
(also: #&)
Zip with future producing new Future.
Methods inherited from Event
#chain, #completed?, #default_executor, #initialize, #inspect, #on_completion, #on_completion!, #pending?, #set, #to_s, #unscheduled?, #wait
Constructor Details
This class inherits a constructor from Concurrent::Edge::Event
Instance Method Details
#any(*futures) ⇒ Future Also known as: |
Returns which has first completed value from futures.
672 673 674 |
# File 'lib/concurrent/edge/future.rb', line 672 def any(*futures) AnyCompletePromise.new([self, *futures], @DefaultExecutor).future end |
#chain_completable(completable_future) ⇒ Object Also known as: tangle
652 653 654 |
# File 'lib/concurrent/edge/future.rb', line 652 def chain_completable(completable_future) on_completion! { completable_future.complete_with internal_state } end |
#delay ⇒ Future
Inserts delay into the chain of Futures making rest of it lazy evaluated.
678 679 680 |
# File 'lib/concurrent/edge/future.rb', line 678 def delay ZipFutureEventPromise.new(self, DelayPromise.new(@DefaultExecutor).future, @DefaultExecutor).future end |
#exception(*args) ⇒ Object
629 630 631 632 633 634 635 636 637 638 |
# File 'lib/concurrent/edge/future.rb', line 629 def exception(*args) raise 'obligation is not failed' unless failed? reason = internal_state.reason if reason.is_a?(::Array) reason.each { |e| log ERROR, 'Edge::Future', e } Concurrent::Error.new 'multiple exceptions, inspect log' else reason.exception(*args) end end |
#failed?(state = internal_state) ⇒ Boolean
Has Future been failed?
570 571 572 |
# File 'lib/concurrent/edge/future.rb', line 570 def failed?(state = internal_state) state.completed? && !state.success? end |
#flat(level = 1) ⇒ Object
zips with the Future in the value
667 668 669 |
# File 'lib/concurrent/edge/future.rb', line 667 def flat(level = 1) FlatPromise.new(self, level, @DefaultExecutor).future end |
#fulfilled? ⇒ Boolean
563 564 565 566 |
# File 'lib/concurrent/edge/future.rb', line 563 def fulfilled? deprecated_method 'fulfilled?', 'success?' success? end |
#on_failure(executor = nil) {|reason| ... } ⇒ Object
Returns self.
732 733 734 |
# File 'lib/concurrent/edge/future.rb', line 732 def on_failure(executor = nil, &callback) add_callback :async_callback_on_failure, executor || @DefaultExecutor, callback end |
#on_failure! {|reason| ... } ⇒ Object
Returns self.
744 745 746 |
# File 'lib/concurrent/edge/future.rb', line 744 def on_failure!(&callback) add_callback :callback_on_failure, callback end |
#on_success(executor = nil) {|value| ... } ⇒ Object
Returns self.
726 727 728 |
# File 'lib/concurrent/edge/future.rb', line 726 def on_success(executor = nil, &callback) add_callback :async_callback_on_success, executor || @DefaultExecutor, callback end |
#on_success! {|value| ... } ⇒ Object
Returns self.
738 739 740 |
# File 'lib/concurrent/edge/future.rb', line 738 def on_success!(&callback) add_callback :callback_on_success, callback end |
#reason(timeout = nil) ⇒ Exception?
If the Future can have value nil then it cannot be distinquished from nil returned on timeout. In this case is better to use first wait then value (or similar).
a thread should wait only once! For repeated checking use faster completed? check. If thread waits periodically it will dangerously grow the waiters stack.
Returns the reason of the Future’s failure.
592 593 594 595 |
# File 'lib/concurrent/edge/future.rb', line 592 def reason(timeout = nil) touch internal_state.reason if wait_until_complete timeout end |
#rejected? ⇒ Boolean
574 575 576 577 |
# File 'lib/concurrent/edge/future.rb', line 574 def rejected? deprecated_method 'rejected?', 'failed?' failed? end |
#rescue(executor = nil) {|reason| ... } ⇒ Future
660 661 662 |
# File 'lib/concurrent/edge/future.rb', line 660 def rescue(executor = nil, &callback) RescuePromise.new(self, @DefaultExecutor, executor || @DefaultExecutor, &callback).future end |
#result(timeout = nil) ⇒ Array(Boolean, Object, Exception)?
If the Future can have value nil then it cannot be distinquished from nil returned on timeout. In this case is better to use first wait then value (or similar).
a thread should wait only once! For repeated checking use faster completed? check. If thread waits periodically it will dangerously grow the waiters stack.
Returns triplet of success, value, reason.
600 601 602 603 |
# File 'lib/concurrent/edge/future.rb', line 600 def result(timeout = nil) touch internal_state.result if wait_until_complete timeout end |
#schedule(intended_time) ⇒ Future
Schedules rest of the chain for execution with specified time or on specified time
684 685 686 687 688 689 690 |
# File 'lib/concurrent/edge/future.rb', line 684 def schedule(intended_time) chain do ZipFutureEventPromise.new(self, ScheduledPromise.new(@DefaultExecutor, intended_time).event, @DefaultExecutor).future end.flat end |
#state ⇒ :pending, ...
|
|
# File 'lib/concurrent/edge/future.rb', line 554
|
#success?(state = internal_state) ⇒ Boolean
Has Future been success?
559 560 561 |
# File 'lib/concurrent/edge/future.rb', line 559 def success?(state = internal_state) state.completed? && state.success? end |
#then(executor = nil) {|value| ... } ⇒ Future
642 643 644 |
# File 'lib/concurrent/edge/future.rb', line 642 def then(executor = nil, &callback) ThenPromise.new(self, @DefaultExecutor, executor || @DefaultExecutor, &callback).future end |
#then_ask(actor) ⇒ Future
Asks the actor with its value.
648 649 650 |
# File 'lib/concurrent/edge/future.rb', line 648 def then_ask(actor) self.then { |v| actor.ask(v) }.flat end |
#then_put(channel) ⇒ Object
may block
only proof of concept
720 721 722 |
# File 'lib/concurrent/edge/future.rb', line 720 def then_put(channel) on_success(:io) { |value| channel.put value } end |
#then_select(*channels) ⇒ Future
Zips with selected value form the suplied channels
694 695 696 |
# File 'lib/concurrent/edge/future.rb', line 694 def then_select(*channels) ZipFuturesPromise.new([self, Concurrent.select(*channels)], @DefaultExecutor).future end |
#value(timeout = nil) ⇒ Object?
If the Future can have value nil then it cannot be distinquished from nil returned on timeout. In this case is better to use first wait then value (or similar).
a thread should wait only once! For repeated checking use faster completed? check. If thread waits periodically it will dangerously grow the waiters stack.
Returns the value of the Future when success, nil on timeout.
584 585 586 587 |
# File 'lib/concurrent/edge/future.rb', line 584 def value(timeout = nil) touch internal_state.value if wait_until_complete timeout end |
#value!(timeout = nil) ⇒ Object?
If the Future can have value nil then it cannot be distinquished from nil returned on timeout. In this case is better to use first wait then value (or similar).
a thread should wait only once! For repeated checking use faster completed? check. If thread waits periodically it will dangerously grow the waiters stack.
Wait until Future is #complete?
622 623 624 625 |
# File 'lib/concurrent/edge/future.rb', line 622 def value!(timeout = nil) touch internal_state.value if wait_until_complete! timeout end |
#wait!(timeout = nil) ⇒ Event, ...
a thread should wait only once! For repeated checking use faster completed? check. If thread waits periodically it will dangerously grow the waiters stack.
Wait until Future is #complete?
610 611 612 613 614 |
# File 'lib/concurrent/edge/future.rb', line 610 def wait!(timeout = nil) touch result = wait_until_complete!(timeout) timeout ? result : self end |
#with_default_executor(executor) ⇒ Future
Changes default executor for rest of the chain
700 701 702 |
# File 'lib/concurrent/edge/future.rb', line 700 def with_default_executor(executor) FutureWrapperPromise.new(self, executor).future end |
#zip(other) ⇒ Future Also known as: &
Zip with future producing new Future
706 707 708 709 710 711 712 |
# File 'lib/concurrent/edge/future.rb', line 706 def zip(other) if other.is_a?(Future) ZipFutureFuturePromise.new(self, other, @DefaultExecutor).future else ZipFutureEventPromise.new(self, other, @DefaultExecutor).future end end |