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.
- data/History.rdoc +10 -0
- data/lib/hamster/hash.rb +4 -0
- data/lib/hamster/list.rb +4 -0
- data/lib/hamster/set.rb +11 -0
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/hash/hash_spec.rb +46 -0
- data/spec/hamster/list/hash_spec.rb +58 -0
- data/spec/hamster/set/flatten_spec.rb +38 -0
- data/spec/hamster/set/hash_spec.rb +46 -0
- metadata +7 -3
data/History.rdoc
CHANGED
data/lib/hamster/hash.rb
CHANGED
data/lib/hamster/list.rb
CHANGED
data/lib/hamster/set.rb
CHANGED
@@ -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
|
data/lib/hamster/version.rb
CHANGED
@@ -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
|
-
-
|
9
|
-
version: 0.2.
|
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-
|
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
|