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