class Core::Async::Future
- public
-
Represents a future result.
Public Class Methods
new(task)
click to toggle source
# File lib/core/async/future.rb, line 13 def initialize(task) @task = task @error = nil end
Public Instance Methods
cancel()
click to toggle source
- public
-
Attempt to cancel the future, returns true if successful.
# File lib/core/async/future.rb, line 30 def cancel if pending? @task.stop end self end
canceled?()
click to toggle source
- public
-
Return `true` if canceled.
# File lib/core/async/future.rb, line 115 def canceled? status == :canceled end
complete?()
click to toggle source
- public
-
Return `true` if complete.
# File lib/core/async/future.rb, line 121 def complete? status == :complete end
error()
click to toggle source
- public
-
Return any error that occurred without re-raising, blocking until available.
# File lib/core/async/future.rb, line 58 def error @error ||= get_error end
failed?()
click to toggle source
- public
-
Return `true` if failed.
# File lib/core/async/future.rb, line 109 def failed? status == :failed end
pending?()
click to toggle source
- public
-
Return `true` if pending.
# File lib/core/async/future.rb, line 103 def pending? status == :pending end
resolved?()
click to toggle source
- public
-
Return `true` if failed or complete.
# File lib/core/async/future.rb, line 127 def resolved? failed? || complete? end
result()
click to toggle source
- public
-
Return the result, blocking until available.
# File lib/core/async/future.rb, line 40 def result @error || @result ||= resolve end
status()
click to toggle source
- public
-
Return the status; one of :pending, :failed, or :complete.
# File lib/core/async/future.rb, line 71 def status if defined?(@status) @status else status = find_status if terminal_status?(status) @status = status end status end end
wait()
click to toggle source
- public
-
Wait on the future to resolve, returning self.
# File lib/core/async/future.rb, line 20 def wait unless @error resolve end self end
Private Instance Methods
find_status()
click to toggle source
# File lib/core/async/future.rb, line 84 def find_status case @task.status when :running :pending when :stopped :canceled when :failed :failed when :complete :complete end end
get_error()
click to toggle source
# File lib/core/async/future.rb, line 62 def get_error result nil rescue => error error end
resolve()
click to toggle source
# File lib/core/async/future.rb, line 44 def resolve wait_all(@task) resolve_value(@task.result) rescue UncaughtThrowError => error throw error.tag, error.value rescue => error @error = error raise error end
resolve_value(value)
click to toggle source
# File lib/core/async/future.rb, line 131 def resolve_value(value) if value.is_a?(self.class) resolve_value(value.result) else value end end
terminal_status?(status)
click to toggle source
# File lib/core/async/future.rb, line 97 def terminal_status?(status) status == :failed || status == :complete end
wait_all(task)
click to toggle source
# File lib/core/async/future.rb, line 139 def wait_all(task) task.children&.each do |child| wait_all(child) end task.wait end