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 |