class Eventkit::Promise

Constants

VERSION

Attributes

task_scheduler[R]
value[R]

Public Class Methods

new(task_scheduler) { |self| ... } click to toggle source
# File lib/eventkit/promise.rb, line 7
def initialize(task_scheduler)
  @on_fullfiled = []
  @on_rejected  = []
  @state = :pending
  @task_scheduler = task_scheduler
  @resolved_with_promise = false
  yield self if block_given?
end

Public Instance Methods

catch(&handler) click to toggle source
# File lib/eventkit/promise.rb, line 82
def catch(&handler)
  self.then(nil, handler)
end
on_fullfiled(&handler) click to toggle source
# File lib/eventkit/promise.rb, line 74
def on_fullfiled(&handler)
  self.then(handler)
end
on_rejected(&handler) click to toggle source
# File lib/eventkit/promise.rb, line 78
def on_rejected(&handler)
  self.then(nil, handler)
end
pending?() click to toggle source
# File lib/eventkit/promise.rb, line 16
def pending?
  @state == :pending
end
reject(value) click to toggle source
# File lib/eventkit/promise.rb, line 67
def reject(value)
  return unless pending? && !@resolved_with_promise

  run_rejection(value)
  self
end
rejected?() click to toggle source
# File lib/eventkit/promise.rb, line 24
def rejected?
  @state == :rejected
end
resolve(value) click to toggle source
# File lib/eventkit/promise.rb, line 58
def resolve(value)
  fail TypeError, 'Promised resolved with itself' if self == value

  return unless pending? && !@resolved_with_promise

  run_resolution(value)
  self
end
resolved?() click to toggle source
# File lib/eventkit/promise.rb, line 20
def resolved?
  @state == :resolved
end
then(on_fullfiled_handler = nil, on_rejected_handler = nil) click to toggle source
# File lib/eventkit/promise.rb, line 28
def then(on_fullfiled_handler = nil, on_rejected_handler = nil)
  promise = Promise.new(task_scheduler)

  add_on_fullfiled { |value|
    begin
      if on_fullfiled_handler
        promise.resolve(on_fullfiled_handler.to_proc.call(value))
      else
        promise.resolve(value)
      end
    rescue => error
      promise.reject(error)
    end
  }

  add_on_rejected { |value|
    begin
      if on_rejected_handler
        promise.resolve(on_rejected_handler.to_proc.call(value))
      else
        promise.reject(value)
      end
    rescue => error
      promise.reject(error)
    end
  }

  promise
end

Private Instance Methods

add_on_fullfiled(&handler) click to toggle source
# File lib/eventkit/promise.rb, line 88
def add_on_fullfiled(&handler)
  if resolved?
    schedule_execution(handler)
  else
    @on_fullfiled << handler
  end
end
add_on_rejected(&handler) click to toggle source
# File lib/eventkit/promise.rb, line 96
def add_on_rejected(&handler)
  if rejected?
    schedule_execution(handler)
  else
    @on_rejected << handler
  end
end
run_rejection(value) click to toggle source
# File lib/eventkit/promise.rb, line 120
def run_rejection(value)
  @value = value
  @on_rejected.each(&method(:schedule_execution))
  @state = :rejected
end
run_resolution(value) click to toggle source
# File lib/eventkit/promise.rb, line 104
def run_resolution(value)
  if value.respond_to?(:then)
    begin
      value.then(->(v) { run_resolution(v) },
                 ->(v) { run_rejection(v) })
      @resolved_with_promise = true
    rescue => e
      reject(e)
    end
  else
    @state = :resolved
    @value = value
    @on_fullfiled.each(&method(:schedule_execution))
  end
end
schedule_execution(handler) click to toggle source
# File lib/eventkit/promise.rb, line 126
def schedule_execution(handler)
  task_scheduler.schedule_execution { handler.call(value) }
end