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.
662 663 664 |
# File 'lib/concurrent/edge/future.rb', line 662 def any(*futures) AnyPromise.new([self, *futures], @DefaultExecutor).future end |
#chain_completable(completable_future) ⇒ Object Also known as: tangle
642 643 644 |
# File 'lib/concurrent/edge/future.rb', line 642 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.
668 669 670 |
# File 'lib/concurrent/edge/future.rb', line 668 def delay ZipFutureEventPromise.new(self, Delay.new(@DefaultExecutor).future, @DefaultExecutor).future end |
#exception(*args) ⇒ Object
619 620 621 622 623 624 625 626 627 628 |
# File 'lib/concurrent/edge/future.rb', line 619 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?
560 561 562 |
# File 'lib/concurrent/edge/future.rb', line 560 def failed?(state = internal_state) state.completed? && !state.success? end |
#flat(level = 1) ⇒ Object
zips with the Future in the value
657 658 659 |
# File 'lib/concurrent/edge/future.rb', line 657 def flat(level = 1) FlatPromise.new(self, level, @DefaultExecutor).future end |
#fulfilled? ⇒ Boolean
553 554 555 556 |
# File 'lib/concurrent/edge/future.rb', line 553 def fulfilled? deprecated_method 'fulfilled?', 'success?' success? end |
#on_failure(executor = nil) {|reason| ... } ⇒ Object
Returns self.
722 723 724 |
# File 'lib/concurrent/edge/future.rb', line 722 def on_failure(executor = nil, &callback) add_callback :pr_async_callback_on_failure, executor || @DefaultExecutor, callback end |
#on_failure! {|reason| ... } ⇒ Object
Returns self.
734 735 736 |
# File 'lib/concurrent/edge/future.rb', line 734 def on_failure!(&callback) add_callback :pr_callback_on_failure, callback end |
#on_success(executor = nil) {|value| ... } ⇒ Object
Returns self.
716 717 718 |
# File 'lib/concurrent/edge/future.rb', line 716 def on_success(executor = nil, &callback) add_callback :pr_async_callback_on_success, executor || @DefaultExecutor, callback end |
#on_success! {|value| ... } ⇒ Object
Returns self.
728 729 730 |
# File 'lib/concurrent/edge/future.rb', line 728 def on_success!(&callback) add_callback :pr_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.
582 583 584 585 |
# File 'lib/concurrent/edge/future.rb', line 582 def reason(timeout = nil) touch internal_state.reason if wait_until_complete timeout end |
#rejected? ⇒ Boolean
564 565 566 567 |
# File 'lib/concurrent/edge/future.rb', line 564 def rejected? deprecated_method 'rejected?', 'failed?' failed? end |
#rescue(executor = nil) {|reason| ... } ⇒ Future
650 651 652 |
# File 'lib/concurrent/edge/future.rb', line 650 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.
590 591 592 593 |
# File 'lib/concurrent/edge/future.rb', line 590 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
674 675 676 677 678 679 680 |
# File 'lib/concurrent/edge/future.rb', line 674 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 544
|
#success?(state = internal_state) ⇒ Boolean
Has Future been success?
549 550 551 |
# File 'lib/concurrent/edge/future.rb', line 549 def success?(state = internal_state) state.completed? && state.success? end |
#then(executor = nil) {|value| ... } ⇒ Future
632 633 634 |
# File 'lib/concurrent/edge/future.rb', line 632 def then(executor = nil, &callback) ThenPromise.new(self, @DefaultExecutor, executor || @DefaultExecutor, &callback).future end |
#then_ask(actor) ⇒ Future
Asks the actor with its value.
638 639 640 |
# File 'lib/concurrent/edge/future.rb', line 638 def then_ask(actor) self.then { |v| actor.ask(v) }.flat end |
#then_put(channel) ⇒ Object
may block
only proof of concept
710 711 712 |
# File 'lib/concurrent/edge/future.rb', line 710 def then_put(channel) on_success(:io) { |value| channel.put value } end |
#then_select(*channels) ⇒ Future
Zips with selected value form the suplied channels
684 685 686 |
# File 'lib/concurrent/edge/future.rb', line 684 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.
574 575 576 577 |
# File 'lib/concurrent/edge/future.rb', line 574 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?
612 613 614 615 |
# File 'lib/concurrent/edge/future.rb', line 612 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?
600 601 602 603 604 |
# File 'lib/concurrent/edge/future.rb', line 600 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
690 691 692 |
# File 'lib/concurrent/edge/future.rb', line 690 def with_default_executor(executor) FutureWrapperPromise.new(self, executor).future end |
#zip(other) ⇒ Future Also known as: &
Zip with future producing new Future
696 697 698 699 700 701 702 |
# File 'lib/concurrent/edge/future.rb', line 696 def zip(other) if other.is_a?(Future) ZipFutureFuturePromise.new(self, other, @DefaultExecutor).future else ZipFutureEventPromise.new(self, other, @DefaultExecutor).future end end |