hamster 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,13 @@
1
+ === 0.2.13 / 2010-03-25
2
+
3
+ * Implement Hash#hash.
4
+
5
+ * Implement Set#hash.
6
+
7
+ * Implement List#hash.
8
+
9
+ * Implement Set#flatten.
10
+
1
11
  === 0.2.12 / 2010-03-01
2
12
 
3
13
  * Fixed bug: List#join accidentally modifying head if it was a string.
@@ -128,6 +128,10 @@ module Hamster
128
128
  end
129
129
  def_delegator :self, :eql?, :==
130
130
 
131
+ def hash
132
+ reduce(0) { |h, key, value| h ^ key.hash }
133
+ end
134
+
131
135
  def dup
132
136
  self
133
137
  end
@@ -449,6 +449,10 @@ module Hamster
449
449
  end
450
450
  def_delegator :self, :eql?, :==
451
451
 
452
+ def hash
453
+ reduce(0) { |h, item| h ^ item.hash }
454
+ end
455
+
452
456
  def dup
453
457
  self
454
458
  end
@@ -226,6 +226,13 @@ module Hamster
226
226
  remove(&:nil?)
227
227
  end
228
228
 
229
+ def flatten
230
+ reduce(EmptySet) do |set, item|
231
+ next set.union(item.flatten) if item.is_a?(Set)
232
+ set.add(item)
233
+ end
234
+ end
235
+
229
236
  def group_by(&block)
230
237
  return group_by { |item| item } unless block_given?
231
238
  reduce(Hamster::Hash.new) do |hash, item|
@@ -243,6 +250,10 @@ module Hamster
243
250
  end
244
251
  def_delegator :self, :eql?, :==
245
252
 
253
+ def hash
254
+ reduce(0) { |h, item| h ^ item.hash }
255
+ end
256
+
246
257
  def dup
247
258
  self
248
259
  end
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.2.12".freeze
3
+ VERSION = "0.2.13".freeze
4
4
 
5
5
  end
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ require 'hamster/hash'
4
+
5
+ describe Hamster::Hash do
6
+
7
+ describe "#hash" do
8
+
9
+ describe "on an empty hash" do
10
+
11
+ before do
12
+ @result = Hamster.hash.hash
13
+ end
14
+
15
+ it "returns 0" do
16
+ @result.should == 0
17
+ end
18
+
19
+ end
20
+
21
+ describe "on a non-empty hash" do
22
+
23
+ class Item
24
+
25
+ attr_reader :hash
26
+
27
+ def initialize(h)
28
+ @hash = h
29
+ end
30
+
31
+ end
32
+
33
+ before do
34
+ hash = Hamster.hash(Item.new(19) => "A", Item.new(31) => "B", Item.new(107) => "C")
35
+ @result = hash.hash
36
+ end
37
+
38
+ it "returns XOR of each item's hash" do
39
+ @result.should == 103
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#hash" do
8
+
9
+ describe "on a really big list" do
10
+
11
+ before do
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
+ end
14
+
15
+ it "doesn't run out of stack" do
16
+ lambda { @list.hash }.should_not raise_error
17
+ end
18
+
19
+ end
20
+
21
+ describe "on an empty list" do
22
+
23
+ before do
24
+ @result = Hamster.list.hash
25
+ end
26
+
27
+ it "returns 0" do
28
+ @result.should == 0
29
+ end
30
+
31
+ end
32
+
33
+ describe "on a non-empty list" do
34
+
35
+ class Item
36
+
37
+ attr_reader :hash
38
+
39
+ def initialize(h)
40
+ @hash = h
41
+ end
42
+
43
+ end
44
+
45
+ before do
46
+ list = Hamster.list(Item.new(19), Item.new(31), Item.new(107))
47
+ @result = list.hash
48
+ end
49
+
50
+ it "returns XOR of each item's hash" do
51
+ @result.should == 103
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,38 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ require 'hamster/set'
4
+
5
+ describe Hamster do
6
+
7
+ describe "#flatten" do
8
+
9
+ [
10
+ [[], []],
11
+ [["A"], ["A"]],
12
+ [["A", "B", "C"], ["A", "B", "C"]],
13
+ [["A", Hamster.set("B"), "C"], ["A", "B", "C"]],
14
+ [[Hamster.set("A"), Hamster.set("B"), Hamster.set("C")], ["A", "B", "C"]],
15
+ ].each do |values, expected|
16
+
17
+ describe "on #{values}" do
18
+
19
+ before do
20
+ @original = Hamster.set(*values)
21
+ @result = @original.flatten
22
+ end
23
+
24
+ it "preserves the original" do
25
+ @original.should == Hamster.set(*values)
26
+ end
27
+
28
+ it "returns an empty set" do
29
+ @result.should == Hamster.set(*expected)
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ require 'hamster/set'
4
+
5
+ describe Hamster::Set do
6
+
7
+ describe "#hash" do
8
+
9
+ describe "on an empty set" do
10
+
11
+ before do
12
+ @result = Hamster.set.hash
13
+ end
14
+
15
+ it "returns 0" do
16
+ @result.should == 0
17
+ end
18
+
19
+ end
20
+
21
+ describe "on a non-empty set" do
22
+
23
+ class Item
24
+
25
+ attr_reader :hash
26
+
27
+ def initialize(h)
28
+ @hash = h
29
+ end
30
+
31
+ end
32
+
33
+ before do
34
+ set = Hamster.set(Item.new(19), Item.new(31), Item.new(107))
35
+ @result = set.hash
36
+ end
37
+
38
+ it "returns XOR of each item's hash" do
39
+ @result.should == 103
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 12
9
- version: 0.2.12
8
+ - 13
9
+ version: 0.2.13
10
10
  platform: ruby
11
11
  authors:
12
12
  - Simon Harris
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-01 00:00:00 +11:00
17
+ date: 2010-03-25 00:00:00 +11:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -85,6 +85,7 @@ files:
85
85
  - spec/hamster/hash/find_spec.rb
86
86
  - spec/hamster/hash/get_spec.rb
87
87
  - spec/hamster/hash/has_key_spec.rb
88
+ - spec/hamster/hash/hash_spec.rb
88
89
  - spec/hamster/hash/inspect_spec.rb
89
90
  - spec/hamster/hash/keys_spec.rb
90
91
  - spec/hamster/hash/map_spec.rb
@@ -124,6 +125,7 @@ files:
124
125
  - spec/hamster/list/flatten_spec.rb
125
126
  - spec/hamster/list/grep_spec.rb
126
127
  - spec/hamster/list/group_by_spec.rb
128
+ - spec/hamster/list/hash_spec.rb
127
129
  - spec/hamster/list/head_spec.rb
128
130
  - spec/hamster/list/include_spec.rb
129
131
  - spec/hamster/list/init_spec.rb
@@ -175,8 +177,10 @@ files:
175
177
  - spec/hamster/set/exclusion_spec.rb
176
178
  - spec/hamster/set/filter_spec.rb
177
179
  - spec/hamster/set/find_spec.rb
180
+ - spec/hamster/set/flatten_spec.rb
178
181
  - spec/hamster/set/grep_spec.rb
179
182
  - spec/hamster/set/group_by_spec.rb
183
+ - spec/hamster/set/hash_spec.rb
180
184
  - spec/hamster/set/head_spec.rb
181
185
  - spec/hamster/set/include_spec.rb
182
186
  - spec/hamster/set/inspect_spec.rb