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
@@ -6,7 +6,7 @@ describe IO do
6
6
 
7
7
  describe "#to_list" do
8
8
 
9
- context "with a File" do
9
+ describe "with a File" do
10
10
 
11
11
  it "returns an equivalent list" do
12
12
  File.open(File.dirname(__FILE__) + "/io_spec.txt") do |io|
@@ -16,7 +16,7 @@ describe IO do
16
16
 
17
17
  end
18
18
 
19
- context "with a StringIO" do
19
+ describe "with a StringIO" do
20
20
 
21
21
  it "returns an equivalent list" do
22
22
  StringIO.new("A\nB\nC\n").to_list.should == Hamster.list("A\n", "B\n", "C\n")
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_set'
4
+
5
+ describe Hamster::MutableSet do
6
+
7
+ describe "#add?" do
8
+
9
+ before do
10
+ @set = Hamster.mutable_set("A", "B", "C")
11
+ end
12
+
13
+ describe "with a unique value" do
14
+
15
+ before do
16
+ @result = @set.add?("D")
17
+ end
18
+
19
+ it "returns true" do
20
+ @result.should == true
21
+ end
22
+
23
+ it "modifies the set to include the new value" do
24
+ @set.should == Hamster.mutable_set("A", "B", "C", "D")
25
+ end
26
+
27
+ end
28
+
29
+ describe "with a duplicate value" do
30
+
31
+ before do
32
+ @result = @set.add?("C")
33
+ end
34
+
35
+ it "preserves the original values" do
36
+ @set.should == Hamster.mutable_set("A", "B", "C")
37
+ end
38
+
39
+ it "returns false" do
40
+ @result.should == false
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_set'
4
+
5
+ describe Hamster::MutableSet do
6
+
7
+ [:add, :<<].each do |method|
8
+
9
+ describe "##{method}" do
10
+
11
+ before do
12
+ @set = Hamster.mutable_set("A", "B", "C")
13
+ end
14
+
15
+ describe "with a unique value" do
16
+
17
+ before do
18
+ @result = @set.send(method, "D")
19
+ end
20
+
21
+ it "returns self" do
22
+ @result.should equal(@set)
23
+ end
24
+
25
+ it "modifies the set to include the new value" do
26
+ @set.should == Hamster.mutable_set("A", "B", "C", "D")
27
+ end
28
+
29
+ end
30
+
31
+ describe "with a duplicate value" do
32
+
33
+ before do
34
+ @result = @set.send(method, "C")
35
+ end
36
+
37
+ it "preserves the original values" do
38
+ @set.should == Hamster.mutable_set("A", "B", "C")
39
+ end
40
+
41
+ it "returns self" do
42
+ @result.should equal(@set)
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_set'
4
+
5
+ describe Hamster::Set do
6
+
7
+ describe "#delete?" do
8
+
9
+ before do
10
+ @set = Hamster.mutable_set("A", "B", "C")
11
+ end
12
+
13
+ describe "with an existing value" do
14
+
15
+ before do
16
+ @result = @set.delete?("B")
17
+ end
18
+
19
+ it "returns true" do
20
+ @result.should == true
21
+ end
22
+
23
+ it "modifies the set to remove the value" do
24
+ @set.should == Hamster.mutable_set("A", "C")
25
+ end
26
+
27
+ end
28
+
29
+ describe "with a non-existing value" do
30
+
31
+ before do
32
+ @result = @set.delete?("D")
33
+ end
34
+
35
+ it "preserves the original values" do
36
+ @set.should == Hamster.mutable_set("A", "B", "C")
37
+ end
38
+
39
+ it "returns false" do
40
+ @result.should == false
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_set'
4
+
5
+ describe Hamster::Set do
6
+
7
+ describe "#delete" do
8
+
9
+ before do
10
+ @set = Hamster.mutable_set("A", "B", "C")
11
+ end
12
+
13
+ describe "with an existing value" do
14
+
15
+ before do
16
+ @result = @set.delete("B")
17
+ end
18
+
19
+ it "returns self" do
20
+ @result.should equal(@set)
21
+ end
22
+
23
+ it "modifies the set to remove the value" do
24
+ @set.should == Hamster.mutable_set("A", "C")
25
+ end
26
+
27
+ end
28
+
29
+ describe "with a non-existing value" do
30
+
31
+ before do
32
+ @result = @set.delete("D")
33
+ end
34
+
35
+ it "preserves the original values" do
36
+ @set.should == Hamster.mutable_set("A", "B", "C")
37
+ end
38
+
39
+ it "returns self" do
40
+ @result.should equal(@set)
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_stack'
4
+
5
+ describe Hamster::MutableStack do
6
+
7
+ [:pop, :dequeue].each do |method|
8
+
9
+ describe "##{method}" do
10
+
11
+ [
12
+ [[], nil, []],
13
+ [["A"], "A", []],
14
+ [["A", "B"], "B", ["A"]],
15
+ [["A", "B", "C"], "C", ["A", "B"]],
16
+ ].each do |initial_state, return_value, resulting_state|
17
+
18
+ describe "on #{initial_state.inspect}" do
19
+
20
+ before do
21
+ @stack = Hamster.mutable_stack(*initial_state)
22
+ @result = @stack.send(method)
23
+ end
24
+
25
+ it "returns #{return_value.inspect}" do
26
+ @result.should == return_value
27
+ end
28
+
29
+ it "modifies the stack to #{resulting_state.inspect}" do
30
+ @stack.should == Hamster.mutable_stack(*resulting_state)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/experimental/mutable_stack'
4
+
5
+ describe Hamster::MutableStack do
6
+
7
+ [:push, :<<, :enqueue].each do |method|
8
+
9
+ describe "##{method}" do
10
+
11
+ [
12
+ [[], "A", ["A"]],
13
+ [["A"], "B", ["A", "B"]],
14
+ [["A"], "A", ["A", "A"]],
15
+ [["A", "B", "C"], "D", ["A", "B", "C", "D"]],
16
+ ].each do |initial_state, new_value, resulting_state|
17
+
18
+ describe "on #{initial_state.inspect} with #{new_value.inspect}" do
19
+
20
+ before do
21
+ @stack = Hamster.mutable_stack(*initial_state)
22
+ @result = @stack.send(method, new_value)
23
+ end
24
+
25
+ it "returns self" do
26
+ @result.should equal(@stack)
27
+ end
28
+
29
+ it "modifies the stack to #{resulting_state.inspect}" do
30
+ @stack.should == Hamster.mutable_stack(*resulting_state)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -22,8 +22,8 @@ describe Hamster::Hash do
22
22
  end
23
23
 
24
24
  it "supports to_proc methods" do
25
- result = @original.put("A", &:next)
26
- result.get("A").should == "ayf"
25
+ result = @original.put("A", &:upcase)
26
+ result.get("A").should == "AYE"
27
27
  end
28
28
 
29
29
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#each_with_index" do
8
+
9
+ describe "with no block" do
10
+
11
+ before do
12
+ @list = Hamster.list("A", "B", "C")
13
+ @result = @list.each_with_index
14
+ end
15
+
16
+ it "returns self" do
17
+ @result.should equal(@list)
18
+ end
19
+
20
+ end
21
+
22
+ describe "with a block" do
23
+
24
+ before do
25
+ @list = Hamster.interval(1, 1025)
26
+ @pairs = []
27
+ @result = @list.each_with_index { |item, index| @pairs << [item, index] }
28
+ end
29
+
30
+ it "returns nil" do
31
+ @result.should be_nil
32
+ end
33
+
34
+ it "iterates over the items in order" do
35
+ @pairs.should == (1..@list.size).zip(0..@list.size.pred)
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -6,18 +6,6 @@ describe Hamster::List do
6
6
 
7
7
  [:head, :first].each do |method|
8
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.filter(&:nil?).head }.should_not raise_error
17
- end
18
-
19
- end
20
-
21
9
  describe "##{method}" do
22
10
 
23
11
  [
@@ -6,12 +6,24 @@ describe Hamster::Set do
6
6
 
7
7
  describe ".set" do
8
8
 
9
- before do
10
- @set = Hamster.set("A", "B", "C")
9
+ describe "with no values" do
10
+
11
+ it "returns the empty set" do
12
+ Hamster.set.should equal(Hamster::EmptySet)
13
+ end
14
+
11
15
  end
12
16
 
13
- it "is equivalent to repeatedly using #add" do
14
- @set.should == Hamster.set.add("A").add("B").add("C")
17
+ describe "with a list of values" do
18
+
19
+ before do
20
+ @set = Hamster.set("A", "B", "C")
21
+ end
22
+
23
+ it "is equivalent to repeatedly using #add" do
24
+ @set.should == Hamster.set.add("A").add("B").add("C")
25
+ end
26
+
15
27
  end
16
28
 
17
29
  end
@@ -56,6 +56,22 @@ describe Hamster::Set do
56
56
 
57
57
  end
58
58
 
59
+ describe "when nothing matches" do
60
+
61
+ before do
62
+ @result = @original.send(method) { |item| false }
63
+ end
64
+
65
+ it "preserves the original" do
66
+ @original.should == Hamster.set("A", "B", "C")
67
+ end
68
+
69
+ it "returns an empty set" do
70
+ @result.should equal(Hamster.set)
71
+ end
72
+
73
+ end
74
+
59
75
  end
60
76
 
61
77
  end
@@ -7,7 +7,6 @@ describe Hamster do
7
7
  describe "#flatten" do
8
8
 
9
9
  [
10
- [[], []],
11
10
  [["A"], ["A"]],
12
11
  [["A", "B", "C"], ["A", "B", "C"]],
13
12
  [["A", Hamster.set("B"), "C"], ["A", "B", "C"]],
@@ -25,7 +24,7 @@ describe Hamster do
25
24
  @original.should == Hamster.set(*values)
26
25
  end
27
26
 
28
- it "returns an empty set" do
27
+ it "returns the inlined values" do
29
28
  @result.should == Hamster.set(*expected)
30
29
  end
31
30
 
@@ -33,6 +32,18 @@ describe Hamster do
33
32
 
34
33
  end
35
34
 
35
+ describe "on an empty set" do
36
+
37
+ before do
38
+ @result = Hamster.set.flatten
39
+ end
40
+
41
+ it "returns an empty set" do
42
+ @result.should equal(Hamster.set)
43
+ end
44
+
45
+ end
46
+
36
47
  end
37
48
 
38
49
  end