hamster 0.3.10 → 0.4.0

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