From a910c93993c4ed4deb27b154491bcbd036ed5a30 Mon Sep 17 00:00:00 2001 From: Fuad Saud Date: Tue, 27 Aug 2013 19:18:22 -0300 Subject: [PATCH] Add Enumerable#frequency --- README.md | 1 + lib/powerpack/enumerable.rb | 1 + lib/powerpack/enumerable/frequencies.rb | 19 ++++++++++++++++++ spec/powerpack/enumerable/frequencies_spec.rb | 20 +++++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 lib/powerpack/enumerable/frequencies.rb create mode 100644 spec/powerpack/enumerable/frequencies_spec.rb diff --git a/README.md b/README.md index 2171e72..d41e138 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ Or install it yourself as: * [Enumerable](http://rdoc.info/github/bbatsov/powerpack/Enumerable) * [#drop_last](http://rdoc.info/github/bbatsov/powerpack/Enumerable#drop_last-instance_method) * [#drop_last_while](http://rdoc.info/github/bbatsov/powerpack/Enumerable#drop_last_while-instance_method) + * [#frequencies](http://rdoc.info/github/bbatsov/powerpack/Enumerable#frequencies-instance_method) * [#several?](http://rdoc.info/github/bbatsov/powerpack/Enumerable#several?-instance_method) * [#sproduct](http://rdoc.info/github/bbatsov/powerpack/Enumerable#sproduct?-instance_method) * [#sum](http://rdoc.info/github/bbatsov/powerpack/Enumerable#sum-instance_method) diff --git a/lib/powerpack/enumerable.rb b/lib/powerpack/enumerable.rb index fded26e..d9ac51f 100644 --- a/lib/powerpack/enumerable.rb +++ b/lib/powerpack/enumerable.rb @@ -1,5 +1,6 @@ require_relative 'enumerable/drop_last' require_relative 'enumerable/drop_last_while' +require_relative 'enumerable/frequencies' require_relative 'enumerable/several' require_relative 'enumerable/sproduct' require_relative 'enumerable/sum' diff --git a/lib/powerpack/enumerable/frequencies.rb b/lib/powerpack/enumerable/frequencies.rb new file mode 100644 index 0000000..7085eac --- /dev/null +++ b/lib/powerpack/enumerable/frequencies.rb @@ -0,0 +1,19 @@ +unless Enumerable.method_defined? :frequencies + module Enumerable + # Counts the number of ocurrence of items in the enumberable. + # + # @return [Hash] in the format value => count + # + # @example + # [].frequency # => {} + # [1, :symbol, 'string', 3, :symbol, 1].frequency + # #=> { 1 => 2, :symbol => 2, 'string' => 1, 3 => 1 } + # + # + def frequencies + inject(Hash.new(0)) do |a, e| + a.tap { |acc| acc[e] += 1 } + end + end + end +end diff --git a/spec/powerpack/enumerable/frequencies_spec.rb b/spec/powerpack/enumerable/frequencies_spec.rb new file mode 100644 index 0000000..7c4ad87 --- /dev/null +++ b/spec/powerpack/enumerable/frequencies_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe 'Enumerable#frequencies' do + context 'empty collection' do + it 'evaluates to an empty hash' do + expect([].frequencies).to eql({}) + end + end + + context 'populated collection' do + it 'counts the number of ocurrences and returns a hash in the form value => count' do + expect([1, 1, :symbol, 3, 1, :symbol, 'string'].frequencies).to eql( + 1 => 3, + 3 => 1, + 'string' => 1, + :symbol => 2 + ) + end + end +end