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