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.
Files changed (73) hide show
  1. data/History.rdoc +10 -0
  2. data/README.rdoc +13 -10
  3. data/lib/hamster.rb +2 -1
  4. data/lib/hamster.rbc +165 -0
  5. data/lib/hamster/core_ext.rbc +69 -0
  6. data/lib/hamster/core_ext/enumerable.rbc +636 -0
  7. data/lib/hamster/core_ext/io.rbc +616 -0
  8. data/lib/hamster/enumerable.rb +141 -0
  9. data/lib/hamster/experimental/mutable_hash.rb +34 -0
  10. data/lib/hamster/experimental/mutable_queue.rb +34 -0
  11. data/lib/hamster/experimental/mutable_set.rb +46 -0
  12. data/lib/hamster/experimental/mutable_stack.rb +35 -0
  13. data/lib/hamster/{read_copy_update.rb → experimental/read_copy_update.rb} +4 -5
  14. data/lib/hamster/hash.rb +1 -0
  15. data/lib/hamster/hash.rbc +4429 -0
  16. data/lib/hamster/immutable.rbc +1609 -0
  17. data/lib/hamster/list.rb +4 -109
  18. data/lib/hamster/list.rbc +15710 -0
  19. data/lib/hamster/queue.rbc +1842 -0
  20. data/lib/hamster/set.rb +6 -111
  21. data/lib/hamster/set.rbc +7780 -0
  22. data/lib/hamster/sorter.rb +2 -2
  23. data/lib/hamster/sorter.rbc +371 -0
  24. data/lib/hamster/stack.rbc +1627 -0
  25. data/lib/hamster/trie.rbc +3527 -0
  26. data/lib/hamster/tuple.rbc +873 -0
  27. data/lib/hamster/undefined.rbc +258 -0
  28. data/lib/hamster/vector.rb +157 -0
  29. data/lib/hamster/version.rb +1 -1
  30. data/lib/hamster/version.rbc +136 -0
  31. data/spec/hamster/core_ext/io_spec.rb +2 -2
  32. data/spec/hamster/experimental/mutable_set/add?_spec.rb +47 -0
  33. data/spec/hamster/experimental/mutable_set/add_spec.rb +51 -0
  34. data/spec/hamster/experimental/mutable_set/delete?_spec.rb +47 -0
  35. data/spec/hamster/experimental/mutable_set/delete_spec.rb +47 -0
  36. data/spec/hamster/experimental/mutable_stack/pop_spec.rb +41 -0
  37. data/spec/hamster/experimental/mutable_stack/push_spec.rb +41 -0
  38. data/spec/hamster/hash/put_spec.rb +2 -2
  39. data/spec/hamster/list/each_with_index_spec.rb +42 -0
  40. data/spec/hamster/list/head_spec.rb +0 -12
  41. data/spec/hamster/set/construction_spec.rb +16 -4
  42. data/spec/hamster/set/filter_spec.rb +16 -0
  43. data/spec/hamster/set/flatten_spec.rb +13 -2
  44. data/spec/hamster/stack/pop_spec.rb +2 -24
  45. data/spec/hamster/vector/add_spec.rb +41 -0
  46. data/spec/hamster/vector/any_spec.rb +67 -0
  47. data/spec/hamster/vector/clear_spec.rb +36 -0
  48. data/spec/hamster/vector/copying_spec.rb +32 -0
  49. data/spec/hamster/vector/each_spec.rb +46 -0
  50. data/spec/hamster/vector/each_with_index_spec.rb +42 -0
  51. data/spec/hamster/vector/empty_spec.rb +35 -0
  52. data/spec/hamster/vector/eql_spec.rb +65 -0
  53. data/spec/hamster/vector/filter_spec.rb +63 -0
  54. data/spec/hamster/vector/first_spec.rb +35 -0
  55. data/spec/hamster/vector/get_spec.rb +81 -0
  56. data/spec/hamster/vector/include_spec.rb +45 -0
  57. data/spec/hamster/vector/inspect_spec.rb +31 -0
  58. data/spec/hamster/vector/last_spec.rb +32 -0
  59. data/spec/hamster/vector/reduce_spec.rb +87 -0
  60. data/spec/hamster/vector/set_spec.rb +153 -0
  61. data/spec/hamster/vector/size_spec.rb +27 -0
  62. data/spec/hamster/vector/to_a_spec.rb +42 -0
  63. data/spec/hamster/vector/to_ary_spec.rb +44 -0
  64. data/spec/spec_helper.rb +2 -2
  65. data/tasks/bundler.rb +2 -0
  66. data/tasks/publish.rb +1 -1
  67. data/tasks/rspec.rb +1 -2
  68. metadata +56 -14
  69. data/lib/hamster/read_copy_update_hash.rb +0 -28
  70. data/lib/hamster/read_copy_update_list.rb +0 -26
  71. data/lib/hamster/read_copy_update_queue.rb +0 -27
  72. data/lib/hamster/read_copy_update_set.rb +0 -26
  73. 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