#--
# Credit goes to Brian Schröder for current code
# and Derek for original.
#++
module Enumerable

  # Generates a hash mapping each unique symbol in the array
  # to the relative frequency, i.e. the probablity, of
  # it appearence.
  def probability
    probs = Hash.new(0.0)
    size = 0.0
    each do | e |
      probs[e] += 1.0
      size += 1.0
    end
    probs.keys.each { |e| probs[e] /= size }
    probs
  end

# old def
#
#   def probability
#     arr = self.to_a
#     probHash = Hash.new
#     size = arr.size.to_f
#     arr.uniq.each do |i|
#       ct = arr.inject(0) do |mem,obj|
#         obj.eql?(i) ? (mem+1) : mem
#       end
#       probHash[i] = ct.to_f/size
#     end
#     probHash
#   end

end



#  _____         _
# |_   _|__  ___| |_
#   | |/ _ \/ __| __|
#   | |  __/\__ \ |_
#   |_|\___||___/\__|
#
=begin test

  require 'test/unit'

  class TCEnumerable < Test::Unit::TestCase

    def test_probability
      assert_equal( {'a'=>0.5,'b'=>0.5}, %w{a b}.probability )
      assert_equal( {'tom'=>0.5,'boy'=>0.5}, %w{tom boy}.probability )
    end

  end

=end
