class Promise

Public Class Methods

new() click to toggle source
# File lib/ruby-promises.rb, line 22
def initialize
  @success_chain = []
  @error_chain = []
end

Public Instance Methods

method_missing(method, *args) click to toggle source
# File lib/ruby-promises.rb, line 47
def method_missing method, *args
  result.send method, *args
end
resolve(arg = nil) click to toggle source
# File lib/ruby-promises.rb, line 41
def resolve arg = nil
  _rescue 'can\'t call result twice!' if @started
  @started = true
  _apply arg
end
then(success = nil, error = nil, &blk) click to toggle source
# File lib/ruby-promises.rb, line 27
def then success = nil, error = nil, &blk
  if blk
    if success.nil?
      success = blk
    elsif error.nil?
      error = blk
    end
  end
  raise ArgumentError.new('the first arg should be callable') unless success.respond_to?(:call)
  raise ArgumentError.new('the second arg should be callable') unless !error || error.respond_to?(:call)
  @success_chain << [success, error]
  self
end

Private Instance Methods

_apply(result = nil) click to toggle source
# File lib/ruby-promises.rb, line 52
def _apply result = nil
  @result = result
  unless @success_chain.empty?
    current = @success_chain.shift
    @error_chain.unshift current
    ThenEnv.new(proc {|*r| _apply(*r) }, proc{|*r| _rescue(*r)}).
      instance_exec(result, &current[0])
  end
  @result
end
_rescue(err) click to toggle source
# File lib/ruby-promises.rb, line 63
def _rescue err
  solved = false
  @error_chain.map {|_, error| error }.compact.each {|error|
    error.call err
    solved = true
  }
  raise err unless solved
end