Sha256: f8831593b4e05971a4d16ed858900f2d72e822dac1935b138cbca20e8c5d8a97

Contents?: true

Size: 1.09 KB

Versions: 3

Compression:

Stored size: 1.09 KB

Contents

require "attentive"
require "thread_safe"
require "delegate"
require "attentive/cursor"
require "attentive/listener"
require "attentive/matcher"

module Attentive
  class ListenerCollection < SimpleDelegator

    def initialize
      super ThreadSafe::Array.new
    end

    def listen_for(*args, &block)
      options = args.last.is_a?(::Hash) ? args.pop : {}

      Attentive::Listener.new(self, args, options, block).tap do |listener|
        push listener
      end
    end

    def hear(message)
      listeners = select { |listener| listener.matches_context?(message) }

      # Listen for any known phrase, starting with any token in the message.
      matches = []
      message.tokens.each_with_index do |token, i|
        listeners.each do |listener|
          listener.phrases.each do |phrase|
            match = Attentive::Matcher.new(phrase, Cursor.new(message, i), listener: listener).match!
            next unless match

            # Don't match more than one phrase per listener
            matches.push match
            break
          end
        end
      end
      matches
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
attentive-0.3.2 lib/attentive/listener_collection.rb
attentive-0.3.1 lib/attentive/listener_collection.rb
attentive-0.3.0 lib/attentive/listener_collection.rb