hamster 0.3.10 → 0.4.0
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/README.rdoc +13 -10
- data/lib/hamster.rb +2 -1
- data/lib/hamster.rbc +165 -0
- data/lib/hamster/core_ext.rbc +69 -0
- data/lib/hamster/core_ext/enumerable.rbc +636 -0
- data/lib/hamster/core_ext/io.rbc +616 -0
- data/lib/hamster/enumerable.rb +141 -0
- data/lib/hamster/experimental/mutable_hash.rb +34 -0
- data/lib/hamster/experimental/mutable_queue.rb +34 -0
- data/lib/hamster/experimental/mutable_set.rb +46 -0
- data/lib/hamster/experimental/mutable_stack.rb +35 -0
- data/lib/hamster/{read_copy_update.rb → experimental/read_copy_update.rb} +4 -5
- data/lib/hamster/hash.rb +1 -0
- data/lib/hamster/hash.rbc +4429 -0
- data/lib/hamster/immutable.rbc +1609 -0
- data/lib/hamster/list.rb +4 -109
- data/lib/hamster/list.rbc +15710 -0
- data/lib/hamster/queue.rbc +1842 -0
- data/lib/hamster/set.rb +6 -111
- data/lib/hamster/set.rbc +7780 -0
- data/lib/hamster/sorter.rb +2 -2
- data/lib/hamster/sorter.rbc +371 -0
- data/lib/hamster/stack.rbc +1627 -0
- data/lib/hamster/trie.rbc +3527 -0
- data/lib/hamster/tuple.rbc +873 -0
- data/lib/hamster/undefined.rbc +258 -0
- data/lib/hamster/vector.rb +157 -0
- data/lib/hamster/version.rb +1 -1
- data/lib/hamster/version.rbc +136 -0
- data/spec/hamster/core_ext/io_spec.rb +2 -2
- data/spec/hamster/experimental/mutable_set/add?_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_set/add_spec.rb +51 -0
- data/spec/hamster/experimental/mutable_set/delete?_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_set/delete_spec.rb +47 -0
- data/spec/hamster/experimental/mutable_stack/pop_spec.rb +41 -0
- data/spec/hamster/experimental/mutable_stack/push_spec.rb +41 -0
- data/spec/hamster/hash/put_spec.rb +2 -2
- data/spec/hamster/list/each_with_index_spec.rb +42 -0
- data/spec/hamster/list/head_spec.rb +0 -12
- data/spec/hamster/set/construction_spec.rb +16 -4
- data/spec/hamster/set/filter_spec.rb +16 -0
- data/spec/hamster/set/flatten_spec.rb +13 -2
- data/spec/hamster/stack/pop_spec.rb +2 -24
- data/spec/hamster/vector/add_spec.rb +41 -0
- data/spec/hamster/vector/any_spec.rb +67 -0
- data/spec/hamster/vector/clear_spec.rb +36 -0
- data/spec/hamster/vector/copying_spec.rb +32 -0
- data/spec/hamster/vector/each_spec.rb +46 -0
- data/spec/hamster/vector/each_with_index_spec.rb +42 -0
- data/spec/hamster/vector/empty_spec.rb +35 -0
- data/spec/hamster/vector/eql_spec.rb +65 -0
- data/spec/hamster/vector/filter_spec.rb +63 -0
- data/spec/hamster/vector/first_spec.rb +35 -0
- data/spec/hamster/vector/get_spec.rb +81 -0
- data/spec/hamster/vector/include_spec.rb +45 -0
- data/spec/hamster/vector/inspect_spec.rb +31 -0
- data/spec/hamster/vector/last_spec.rb +32 -0
- data/spec/hamster/vector/reduce_spec.rb +87 -0
- data/spec/hamster/vector/set_spec.rb +153 -0
- data/spec/hamster/vector/size_spec.rb +27 -0
- data/spec/hamster/vector/to_a_spec.rb +42 -0
- data/spec/hamster/vector/to_ary_spec.rb +44 -0
- data/spec/spec_helper.rb +2 -2
- data/tasks/bundler.rb +2 -0
- data/tasks/publish.rb +1 -1
- data/tasks/rspec.rb +1 -2
- metadata +56 -14
- data/lib/hamster/read_copy_update_hash.rb +0 -28
- data/lib/hamster/read_copy_update_list.rb +0 -26
- data/lib/hamster/read_copy_update_queue.rb +0 -27
- data/lib/hamster/read_copy_update_set.rb +0 -26
- data/lib/hamster/read_copy_update_stack.rb +0 -27
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
[:first, :head].each do |method|
|
8
|
+
|
9
|
+
describe "##{method}" do
|
10
|
+
|
11
|
+
[
|
12
|
+
[[], nil],
|
13
|
+
[["A"], "A"],
|
14
|
+
[["A", "B", "C"], "A"],
|
15
|
+
].each do |values, expected|
|
16
|
+
|
17
|
+
describe "on #{values.inspect}" do
|
18
|
+
|
19
|
+
before do
|
20
|
+
@vector = Hamster.vector(*values)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns #{expected.inspect}" do
|
24
|
+
@vector.send(method).should == expected
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
[:get, :[], :at].each do |method|
|
8
|
+
|
9
|
+
describe "##{method}" do
|
10
|
+
|
11
|
+
describe "when empty" do
|
12
|
+
|
13
|
+
before do
|
14
|
+
@vector = Hamster.vector
|
15
|
+
end
|
16
|
+
|
17
|
+
it "always returns nil" do
|
18
|
+
(-1..1).each do |i|
|
19
|
+
@vector.send(method, i).should be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "when not empty" do
|
26
|
+
|
27
|
+
before do
|
28
|
+
@vector = Hamster.vector(*(1..1025))
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "with a positive index" do
|
32
|
+
|
33
|
+
describe "within the absolute bounds of the vector" do
|
34
|
+
|
35
|
+
it "returns the value at the specified index from the head" do
|
36
|
+
(0..(@vector.size - 1)).each do |i|
|
37
|
+
@vector.send(method, i).should == i + 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "outside the absolute bounds of the vector" do
|
44
|
+
|
45
|
+
it "returns nil" do
|
46
|
+
@vector.send(method, @vector.size).should be_nil
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "with a negative index" do
|
54
|
+
|
55
|
+
describe "within the absolute bounds of the vector" do
|
56
|
+
|
57
|
+
it "returns the value at the specified index from the tail" do
|
58
|
+
(-@vector.size..-1).each do |i|
|
59
|
+
@vector.send(method, i).should == @vector.size + i + 1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "outside the absolute bounds of the vector" do
|
66
|
+
|
67
|
+
it "returns nil" do
|
68
|
+
@vector.send(method, -@vector.size.next).should be_nil
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
[:include?, :member?, :contains?, :elem?].each do |method|
|
8
|
+
|
9
|
+
describe "##{method}" do
|
10
|
+
|
11
|
+
[
|
12
|
+
[[], "A", false],
|
13
|
+
[[], nil, false],
|
14
|
+
[["A"], "A", true],
|
15
|
+
[["A"], "B", false],
|
16
|
+
[["A"], nil, false],
|
17
|
+
[["A", "B", nil], "A", true],
|
18
|
+
[["A", "B", nil], "B", true],
|
19
|
+
[["A", "B", nil], nil, true],
|
20
|
+
[["A", "B", nil], "C", false],
|
21
|
+
[[2], 2, true],
|
22
|
+
[[2], 2.0, true],
|
23
|
+
[[2.0], 2.0, true],
|
24
|
+
[[2.0], 2, true],
|
25
|
+
].each do |values, item, expected|
|
26
|
+
|
27
|
+
describe "on #{values.inspect}" do
|
28
|
+
|
29
|
+
before do
|
30
|
+
@vector = Hamster.vector(*values)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns #{expected.inspect}" do
|
34
|
+
@vector.send(method, item).should == expected
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
describe "#inspect" do
|
8
|
+
|
9
|
+
[
|
10
|
+
[[], "[]"],
|
11
|
+
[["A"], "[\"A\"]"],
|
12
|
+
[["A", "B", "C"], "[\"A\", \"B\", \"C\"]"]
|
13
|
+
].each do |values, expected|
|
14
|
+
|
15
|
+
describe "on #{values.inspect}" do
|
16
|
+
|
17
|
+
before do
|
18
|
+
@vector = Hamster.vector(*values)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns #{expected.inspect}" do
|
22
|
+
@vector.inspect.should == expected
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
describe "#last" do
|
8
|
+
|
9
|
+
[
|
10
|
+
[[], nil],
|
11
|
+
[["A"], "A"],
|
12
|
+
[["A", "B", "C"], "C"],
|
13
|
+
].each do |values, expected|
|
14
|
+
|
15
|
+
describe "on #{values.inspect}" do
|
16
|
+
|
17
|
+
before do
|
18
|
+
original = Hamster.vector(*values)
|
19
|
+
@result = original.last
|
20
|
+
end
|
21
|
+
|
22
|
+
it "returns #{expected.inspect}" do
|
23
|
+
@result.should == expected
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
[:reduce, :inject, :fold, :foldr].each do |method|
|
8
|
+
|
9
|
+
describe "##{method}" do
|
10
|
+
|
11
|
+
[
|
12
|
+
[[], 10, 10],
|
13
|
+
[[1], 10, 9],
|
14
|
+
[[1, 2, 3], 10, 4],
|
15
|
+
].each do |values, initial, expected|
|
16
|
+
|
17
|
+
describe "on #{values.inspect}" do
|
18
|
+
|
19
|
+
before do
|
20
|
+
@vector = Hamster.vector(*values)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "with an initial value of #{initial}" do
|
24
|
+
|
25
|
+
describe "and a block" do
|
26
|
+
|
27
|
+
it "returns #{expected.inspect}" do
|
28
|
+
@vector.send(method, initial) { |memo, item| memo - item }.should == expected
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "and no block" do
|
34
|
+
|
35
|
+
it "returns the memo" do
|
36
|
+
@vector.send(method, initial).should == initial
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
[
|
48
|
+
[[], nil],
|
49
|
+
[[1], 1],
|
50
|
+
[[1, 2, 3], -4],
|
51
|
+
].each do |values, expected|
|
52
|
+
|
53
|
+
describe "on #{values.inspect}" do
|
54
|
+
|
55
|
+
before do
|
56
|
+
@vector = Hamster.vector(*values)
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "with no initial value" do
|
60
|
+
|
61
|
+
describe "and a block" do
|
62
|
+
|
63
|
+
it "returns #{expected.inspect}" do
|
64
|
+
@vector.send(method) { |memo, item| memo - item }.should == expected
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "and no block" do
|
70
|
+
|
71
|
+
it "returns nil" do
|
72
|
+
@vector.send(method).should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'hamster/vector'
|
4
|
+
|
5
|
+
describe Hamster::Vector do
|
6
|
+
|
7
|
+
describe "#set" do
|
8
|
+
|
9
|
+
describe "when empty" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@vector = Hamster.vector
|
13
|
+
end
|
14
|
+
|
15
|
+
it "always raises an error" do
|
16
|
+
(-1..1).each do |i|
|
17
|
+
lambda { @vector.set(i) }.should raise_error
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "when not empty" do
|
24
|
+
|
25
|
+
before do
|
26
|
+
@original = Hamster.vector("A", "B", "C")
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "with a block" do
|
30
|
+
|
31
|
+
describe "and a positive index" do
|
32
|
+
|
33
|
+
describe "within the absolute bounds of the vector" do
|
34
|
+
|
35
|
+
it "passes the current value to the block" do
|
36
|
+
@original.set(1) { |value| value.should == "B" }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "replaces the value with the result of the block" do
|
40
|
+
result = @original.set(1) { |value| "FLIBBLE" }
|
41
|
+
result.should == Hamster.vector("A", "FLIBBLE", "C")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "supports to_proc methods" do
|
45
|
+
result = @original.set(1, &:downcase)
|
46
|
+
result.should == Hamster.vector("A", "b", "C")
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "outside the absolute bounds of the vector" do
|
52
|
+
|
53
|
+
it "raises an error" do
|
54
|
+
lambda { @original.set(@original.size) {} }.should raise_error
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "and a negative index" do
|
62
|
+
|
63
|
+
describe "within the absolute bounds of the vector" do
|
64
|
+
|
65
|
+
it "passes the current value to the block" do
|
66
|
+
@original.set(-2) { |value| value.should == "B" }
|
67
|
+
end
|
68
|
+
|
69
|
+
it "replaces the value with the result of the block" do
|
70
|
+
result = @original.set(-2) { |value| "FLIBBLE" }
|
71
|
+
result.should == Hamster.vector("A", "FLIBBLE", "C")
|
72
|
+
end
|
73
|
+
|
74
|
+
it "supports to_proc methods" do
|
75
|
+
result = @original.set(-2, &:downcase)
|
76
|
+
result.should == Hamster.vector("A", "b", "C")
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "outside the absolute bounds of the vector" do
|
82
|
+
|
83
|
+
it "raises an error" do
|
84
|
+
lambda { @original.set(-@original.size.next) {} }.should raise_error
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "with a value" do
|
94
|
+
|
95
|
+
describe "and a positive index" do
|
96
|
+
|
97
|
+
describe "within the absolute bounds of the vector" do
|
98
|
+
|
99
|
+
before do
|
100
|
+
@result = @original.set(1, "FLIBBLE")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "preserves the original" do
|
104
|
+
@original.should == Hamster.vector("A", "B", "C")
|
105
|
+
end
|
106
|
+
|
107
|
+
it "sets the new value at the specified index" do
|
108
|
+
@result.should == Hamster.vector("A", "FLIBBLE", "C")
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "outside the absolute bounds of the vector" do
|
114
|
+
|
115
|
+
it "raises an error" do
|
116
|
+
lambda { @original.set(@original.size, "FLIBBLE") }.should raise_error
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "with a negative index" do
|
124
|
+
|
125
|
+
before do
|
126
|
+
@result = @original.set(-2, "FLIBBLE")
|
127
|
+
end
|
128
|
+
|
129
|
+
it "preserves the original" do
|
130
|
+
@original.should == Hamster.vector("A", "B", "C")
|
131
|
+
end
|
132
|
+
|
133
|
+
it "sets the new value at the specified index" do
|
134
|
+
@result.should == Hamster.vector("A", "FLIBBLE", "C")
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "outside the absolute bounds of the vector" do
|
140
|
+
|
141
|
+
it "raises an error" do
|
142
|
+
lambda { @original.set(-@original.size.next, "FLIBBLE") }.should raise_error
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|