class Concurrent::Actor::Utils::Broadcast

Allows to build pub/sub easily. @example news

news_channel = Concurrent::Actor::Utils::Broadcast.spawn :news

2.times do |i|
  Concurrent::Actor::Utils::AdHoc.spawn "listener-#{i}" do
    news_channel << :subscribe
    -> message { puts message }
  end
end

news_channel << 'Ruby rocks!'
# prints: 'Ruby rocks!' twice

Public Class Methods

new() click to toggle source
# File lib/concurrent/actor/utils/broadcast.rb, line 22
def initialize
  @receivers = Set.new
end

Public Instance Methods

filtered_receivers() click to toggle source

override to define different behaviour, filtering etc

# File lib/concurrent/actor/utils/broadcast.rb, line 45
def filtered_receivers
  @receivers
end
on_message(message) click to toggle source
# File lib/concurrent/actor/utils/broadcast.rb, line 26
def on_message(message)
  case message
  when :subscribe
    if envelope.sender.is_a? Reference
      @receivers.add envelope.sender
      true
    else
      false
    end
  when :unsubscribe
    !!@receivers.delete(envelope.sender)
  when :subscribed?
    @receivers.include? envelope.sender
  else
    filtered_receivers.each { |r| r << message }
  end
end