Sha256: f67146301e8a7195e66f1875a30f7d18308a647f1cdd3c5700e221a3b6aa3230

Contents?: true

Size: 1.09 KB

Versions: 1

Compression:

Stored size: 1.09 KB

Contents

# encoding: utf-8

class Promise
  class Callback
    def initialize(promise, on_fulfill, on_reject, next_promise)
      @promise = promise
      @on_fulfill = on_fulfill
      @on_reject = on_reject
      @next_promise = next_promise
    end

    def block
      @promise.fulfilled? ? @on_fulfill : @on_reject
    end

    def param
      @promise.fulfilled? ? @promise.value : @promise.reason
    end

    def dispatch
      if block
        handle_result { execute }
      else
        assume_state(@promise, @next_promise)
      end
    end

    def execute
      block.call(param)
    rescue => ex
      @next_promise.reject(ex, @promise.backtrace)
      raise
    end

    def handle_result
      if Promise === (result = yield)
        assume_state(result, @next_promise)
      else
        @next_promise.fulfill(result, @promise.backtrace)
      end
    end

    def assume_state(source, target)
      on_fulfill = proc { target.fulfill(source.value, source.backtrace) }
      on_reject  = proc { target.reject(source.reason, source.backtrace) }

      source.then(on_fulfill, on_reject)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
promise.rb-0.7.0.rc1 lib/promise/callback.rb