jimmycuadra/tam_tam

View on GitHub
lib/tam_tam/message_set.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "tam_tam/message"

module TamTam
  # A collection of messages. Responsible for filtering and manipulating
  # messages.
  class MessageSet
    include Enumerable

    attr_accessor :data
    protected :data

    def initialize(data)
      self.data = data.map { |data| Message.new(data) }
    end

    def including(phrase)
      copy = dup
      copy.data = data.select { |message| message.text.include?(phrase) }
      copy
    end

    def matching(pattern)
      copy = dup
      copy.data = data.select { |message| message.text.match(pattern) }
      copy
    end

    def sent_by(sender)
      copy = dup
      copy.data = data.select { |message| message.sender == sender }
      copy
    end

    def by_count
      Hash[group_by { |message| message.text }.inject({}) { |counts, groups|
        counts[groups[0]] = groups[1].size
        counts
      }.sort_by { |key, value| -value }]
    end

    def each
      data.each { |message| yield message }
    end

    def ==(other)
      data == other.data
    end

    def to_s
      %{#<#{self.class.name}:0x#{object_id.to_s(16)} size=#{size}>}
    end
    alias_method :inspect, :to_s

    def size
      data.size
    end
    alias_method :length, :size
  end
end