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
receive(channel, &block)
Alias for: take
send(channel, message, &block)
Alias for: put
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
timeout(seconds, &block)
Alias for: after