Sha256: baad062bd65ab4017a7a16b842573d0d3153ed7df29a923d089fde7746ae947e

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

require 'rpromise/version'

class Rpromise
  module State
    PENDING   = :pending
    RESOLVED  = :resolved
    REJECTED  = :rejected
  end

  Handler = Struct.new(:on_resolved, :on_rejected, :resolve, :reject)

  attr_reader :state, :thread

  def initialize()
    @state = State::PENDING
    @defered = nil
    @thread = Thread.new do
      begin
        yield(method(:resolve!), method(:reject!))
      rescue Exception => e
        reject!(e)
      end
    end
  rescue Exception => e
    reject!(e)
  end

  def then(on_resolved = nil, on_rejected = nil)
    raise ArgumentError unless is_valid_block?(on_resolved)
    raise ArgumentError unless is_valid_block?(on_rejected)
    return self if on_resolved.nil? && on_rejected.nil?
    return ::Rpromise.new do |resolve, reject|
      handler = Handler.new(on_resolved, on_rejected, resolve, reject)
      handle(handler)
    end
  end

  def pending?
    return @state == State::PENDING
  end

  def resolved?
    return @state == State::RESOLVED
  end

  def rejected?
    return @state == State::REJECTED
  end

  def resolve!(value = nil)
    if value.is_a?(::Rpromise)
      value.then(method(:resolve!), method(:reject!))
      return
    end

    @state = State::RESOLVED
    @value = value

    unless @defered.nil?
      handle(@defered)
    end
  end

  def reject!(value = nil)
    @state = State::REJECTED
    @value = value

    unless @defered.nil?
      handle(@defered)
    end
  end

  protected

  def is_valid_block?(arg)
    return arg.nil? || arg.is_a?(Proc) || arg.is_a?(Method)
  end

  def handle(handler)
    if pending?
      @defered = handler
      return nil
    end

    callback = nil

    if resolved?
      callback = handler.on_resolved
    else
      callback = handler.on_rejected
    end

    unless callback.nil?
      output = nil
      output = callback.call(@value)
      handler.resolve.call(output) unless handler.resolve.nil?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rpromise-0.1.0 lib/rpromise.rb