class Concurrent::Channel::Selector
@!visibility private
Public Class Methods
new()
click to toggle source
# File lib/concurrent/channel/selector.rb, line 14 def initialize @clauses = [] @error_handler = nil end
Public Instance Methods
after(seconds, &block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 40 def after(seconds, &block) @clauses << AfterClause.new(seconds, block) end
Also aliased as: timeout
case(channel, action, message = nil, &block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 19 def case(channel, action, message = nil, &block) if [:take, :poll, :receive, :~].include?(action) take(channel, &block) elsif [:put, :offer, :send, :<<].include?(action) put(channel, message, &block) else raise ArgumentError.new('invalid action') end end
default(&block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 45 def default(&block) raise ArgumentError.new('no block given') unless block_given? @clauses << DefaultClause.new(block) end
error(&block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 50 def error(&block) raise ArgumentError.new('no block given') unless block_given? raise ArgumentError.new('only one error handler allowed') if @error_handler @error_handler = block end
execute()
click to toggle source
# File lib/concurrent/channel/selector.rb, line 56 def execute raise Channel::Error.new('no clauses given') if @clauses.empty? loop do done = @clauses.each do |clause| result = clause.execute break result if result.just? end break done.value if done.is_a?(Concurrent::Maybe) Thread.pass end rescue => ex if @error_handler @error_handler.call(ex) else raise ex end end
put(channel, message, &block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 35 def put(channel, message, &block) @clauses << PutClause.new(channel, message, block) end
Also aliased as: send
take(channel, &block)
click to toggle source
# File lib/concurrent/channel/selector.rb, line 29 def take(channel, &block) raise ArgumentError.new('no block given') unless block_given? @clauses << TakeClause.new(channel, block) end
Also aliased as: receive