Sha256: 8c44ae2b761fc0ff5dcf27450ae2d9c558fe97b23672ff9503b730b1ce9a31a0
Contents?: true
Size: 1.93 KB
Versions: 3
Compression:
Stored size: 1.93 KB
Contents
require 'rpromise' require 'pry' class ::Rpromise::Promise module State PENDING = :pending RESOLVED = :resolved REJECTED = :rejected end Handler = Struct.new(:on_resolved, :on_rejected, :resolve, :reject) attr_reader :state def initialize() @state = State::PENDING @defered = nil yield(method(:resolve!), method(:reject!),self) 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::Promise.new do |resolve, reject, promise| handler = Handler.new(on_resolved, on_rejected, resolve, reject) self.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::Promise) value.then(method(:resolve!), method(:reject!)) return end @state = State::RESOLVED @value = value unless @defered.nil? handle(@defered) end rescue reject!(nil) 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 rescue handler.reject.call(nil) unless handler.reject.nil? end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
rpromise-0.0.4 | lib/rpromise/promise.rb |
rpromise-0.0.2 | lib/rpromise/promise.rb |
rpromise-0.0.1 | lib/rpromise/promise.rb |