hamster 0.2.12 → 0.2.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -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