hamster 0.1.8 → 0.1.11

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 (69) hide show
  1. data/README.rdoc +34 -10
  2. data/lib/hamster.rb +0 -1
  3. data/lib/hamster/hash.rb +77 -20
  4. data/lib/hamster/list.rb +189 -52
  5. data/lib/hamster/set.rb +78 -23
  6. data/lib/hamster/stack.rb +13 -14
  7. data/lib/hamster/trie.rb +13 -4
  8. data/lib/hamster/version.rb +1 -1
  9. data/spec/hamster/hash/all_spec.rb +53 -0
  10. data/spec/hamster/hash/any_spec.rb +62 -0
  11. data/spec/hamster/hash/construction_spec.rb +21 -5
  12. data/spec/hamster/hash/copying_spec.rb +6 -10
  13. data/spec/hamster/hash/each_spec.rb +6 -18
  14. data/spec/hamster/hash/empty_spec.rb +9 -5
  15. data/spec/hamster/hash/eql_spec.rb +17 -22
  16. data/spec/hamster/hash/filter_spec.rb +61 -0
  17. data/spec/hamster/hash/get_spec.rb +24 -12
  18. data/spec/hamster/hash/has_key_spec.rb +17 -13
  19. data/spec/hamster/hash/map_spec.rb +66 -0
  20. data/spec/hamster/hash/none_spec.rb +62 -0
  21. data/spec/hamster/hash/put_spec.rb +17 -73
  22. data/spec/hamster/hash/reduce_spec.rb +58 -0
  23. data/spec/hamster/hash/reject_spec.rb +57 -0
  24. data/spec/hamster/hash/remove_spec.rb +13 -85
  25. data/spec/hamster/hash/size_spec.rb +25 -0
  26. data/spec/hamster/list/cadr_spec.rb +37 -0
  27. data/spec/hamster/list/construction_spec.rb +46 -6
  28. data/spec/hamster/list/copying_spec.rb +13 -11
  29. data/spec/hamster/list/drop_spec.rb +29 -0
  30. data/spec/hamster/list/drop_while_spec.rb +39 -0
  31. data/spec/hamster/list/each_spec.rb +24 -24
  32. data/spec/hamster/list/empty_spec.rb +15 -6
  33. data/spec/hamster/list/eql_spec.rb +27 -7
  34. data/spec/hamster/list/filter_spec.rb +51 -0
  35. data/spec/hamster/list/head_spec.rb +27 -0
  36. data/spec/hamster/list/include_spec.rb +37 -0
  37. data/spec/hamster/list/lazy_spec.rb +21 -0
  38. data/spec/hamster/list/map_spec.rb +21 -19
  39. data/spec/hamster/list/reduce_spec.rb +27 -15
  40. data/spec/hamster/list/reject_spec.rb +47 -0
  41. data/spec/hamster/list/size_spec.rb +31 -0
  42. data/spec/hamster/list/tail_spec.rb +27 -0
  43. data/spec/hamster/list/take_spec.rb +29 -0
  44. data/spec/hamster/list/take_while_spec.rb +45 -0
  45. data/spec/hamster/set/add_spec.rb +49 -0
  46. data/spec/hamster/set/all_spec.rb +61 -0
  47. data/spec/hamster/set/any_spec.rb +61 -0
  48. data/spec/hamster/set/construction_spec.rb +3 -3
  49. data/spec/hamster/set/copying_spec.rb +21 -0
  50. data/spec/hamster/set/each_spec.rb +36 -0
  51. data/spec/hamster/set/empty_spec.rb +21 -0
  52. data/spec/hamster/set/eql_spec.rb +31 -0
  53. data/spec/hamster/set/filter_spec.rb +61 -0
  54. data/spec/hamster/set/include_spec.rb +29 -0
  55. data/spec/hamster/set/map_spec.rb +66 -0
  56. data/spec/hamster/set/none_spec.rb +61 -0
  57. data/spec/hamster/set/reduce_spec.rb +58 -0
  58. data/spec/hamster/set/reject_spec.rb +57 -0
  59. data/spec/hamster/set/remove_spec.rb +45 -0
  60. data/spec/hamster/set/size_spec.rb +25 -0
  61. data/spec/hamster/stack/copying_spec.rb +1 -1
  62. data/spec/hamster/stack/empty_spec.rb +2 -2
  63. data/spec/hamster/stack/eql_spec.rb +15 -4
  64. data/spec/hamster/stack/push_spec.rb +6 -26
  65. data/spec/hamster/trie/remove_spec.rb +117 -0
  66. metadata +39 -7
  67. data/TODO +0 -1
  68. data/spec/hamster/list/accessor_spec.rb +0 -26
  69. data/spec/hamster/list/car_spec.rb +0 -17
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#tail" do
6
+
7
+ [
8
+ [[], []],
9
+ [["A"], []],
10
+ [["A", "B", "C"], ["B", "C"]],
11
+ ].each do |values, result|
12
+
13
+ describe "on #{values.inspect}" do
14
+
15
+ list = Hamster.list(*values)
16
+
17
+ it "returns #{result}" do
18
+ list.tail.should == Hamster.list(*result)
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#take" do
6
+
7
+ [
8
+ [[], 10, []],
9
+ [["A"], 10, ["A"]],
10
+ [["A"], -1, []],
11
+ [["A", "B", "C"], 0, []],
12
+ [["A", "B", "C"], 2, ["A", "B"]],
13
+ ].each do |values, number, result|
14
+
15
+ describe "#{number} from #{values.inspect}" do
16
+
17
+ list = Hamster.list(*values)
18
+
19
+ it "returns #{result}" do
20
+ list.take(number).should == Hamster.list(*result)
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#take_while" do
6
+
7
+ [
8
+ [[], []],
9
+ [["A"], ["A"]],
10
+ [["A", "B", "C"], ["A", "B"]],
11
+ ].each do |values, result|
12
+
13
+ describe "on #{values.inspect}" do
14
+
15
+ list = Hamster.list(*values)
16
+
17
+ describe "with a block" do
18
+
19
+ it "returns #{result}" do
20
+ list.take_while { |item| item < "C" }.should == Hamster.list(*result)
21
+ end
22
+
23
+ it "is lazy" do
24
+ count = 0
25
+ list.take_while { |item| count += 1; true }
26
+ count.should <= 1
27
+ end
28
+
29
+ end
30
+
31
+ describe "without a block" do
32
+
33
+ it "returns self" do
34
+ list.take_while.should == list
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -0,0 +1,49 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ [:add, :<<].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ before do
10
+ @original = Hamster.set("A", "B", "C")
11
+ end
12
+
13
+ describe "with a unique value" do
14
+
15
+ before do
16
+ @result = @original.send(method, "D")
17
+ end
18
+
19
+ it "preserves the original" do
20
+ @original.should == Hamster.set("A", "B", "C")
21
+ end
22
+
23
+ it "returns a copy with the superset of values" do
24
+ @result.should == Hamster.set("A", "B", "C", "D")
25
+ end
26
+
27
+ end
28
+
29
+ describe "with a duplicate value" do
30
+
31
+ before do
32
+ @result = @original.send(method, "C")
33
+ end
34
+
35
+ it "preserves the original values" do
36
+ @original.should == Hamster.set("A", "B", "C")
37
+ end
38
+
39
+ it "returns self" do
40
+ @result.should equal(@original)
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ describe "#all?" do
6
+
7
+ describe "when empty" do
8
+
9
+ before do
10
+ @set = Hamster.set
11
+ end
12
+
13
+ it "with a block returns true" do
14
+ @set.all? {}.should be_true
15
+ end
16
+
17
+ it "with no block returns true" do
18
+ @set.all?.should be_true
19
+ end
20
+
21
+ end
22
+
23
+ describe "when not empty" do
24
+
25
+ describe "with a block" do
26
+
27
+ before do
28
+ @set = Hamster.set("A", "B", "C")
29
+ end
30
+
31
+ it "returns true if the block always returns true" do
32
+ @set.all? { |item| true }.should be_true
33
+ end
34
+
35
+ it "returns false if the block ever returns false" do
36
+ @set.all? { |item| item == "D" }.should be_false
37
+ end
38
+
39
+ end
40
+
41
+ describe "with no block" do
42
+
43
+ it "returns true if all values are truthy" do
44
+ Hamster.set(true, "A").all?.should be_true
45
+ end
46
+
47
+ [nil, false].each do |value|
48
+
49
+ it "returns false if any value is #{value.inspect}" do
50
+ Hamster.set(value, true, "A").all?.should be_false
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ describe "#any?" do
6
+
7
+ describe "when empty" do
8
+
9
+ before do
10
+ @set = Hamster.set
11
+ end
12
+
13
+ it "with a block returns false" do
14
+ @set.any? {}.should be_false
15
+ end
16
+
17
+ it "with no block returns false" do
18
+ @set.any?.should be_false
19
+ end
20
+
21
+ end
22
+
23
+ describe "when not empty" do
24
+
25
+ describe "with a block" do
26
+
27
+ before do
28
+ @set = Hamster.set("A", "B", "C", nil)
29
+ end
30
+
31
+ ["A", "B", "C", nil].each do |value|
32
+
33
+ it "returns true if the block ever returns true (#{value.inspect})" do
34
+ @set.any? { |item| item == value }.should be_true
35
+ end
36
+
37
+ end
38
+
39
+ it "returns false if the block always returns false" do
40
+ @set.any? { |item| item == "D" }.should be_false
41
+ end
42
+
43
+ end
44
+
45
+ describe "with no block" do
46
+
47
+ it "returns true if any value is truthy" do
48
+ Hamster.set(nil, false, true, "A").any?.should be_true
49
+ end
50
+
51
+ it "returns false if all values are falsey" do
52
+ Hamster.set(nil, false).any?.should be_false
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -2,14 +2,14 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Hamster::Set do
4
4
 
5
- describe ".[]" do
5
+ describe ".set" do
6
6
 
7
7
  before do
8
- @set = Hamster::Set["A", "B", "C"]
8
+ @set = Hamster.set("A", "B", "C")
9
9
  end
10
10
 
11
11
  it "is equivalent to repeatedly using #add" do
12
- @set.should eql(Hamster::Set.new.add("A").add("B").add("C"))
12
+ @set.should == Hamster.set.add("A").add("B").add("C")
13
13
  end
14
14
 
15
15
  end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ before do
6
+ @set = Hamster.set("A", "B", "C")
7
+ end
8
+
9
+ [:dup, :clone].each do |method|
10
+
11
+ describe "##{method}" do
12
+
13
+ it "returns self" do
14
+ @set.send(method).should equal(@set)
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require 'set'
3
+
4
+ describe Hamster::Set do
5
+
6
+ describe "#each" do
7
+
8
+ before do
9
+ @set = Hamster.set("A", "B", "C")
10
+ end
11
+
12
+ describe "with a block (internal iteration)" do
13
+
14
+ it "returns self" do
15
+ @set.each {}.should equal(@set)
16
+ end
17
+
18
+ it "yields all values" do
19
+ actual_values = Set[]
20
+ @set.each { |value| actual_values << value }
21
+ actual_values.should == Set["A", "B", "C"]
22
+ end
23
+
24
+ end
25
+
26
+ describe "with no block (external iteration)" do
27
+
28
+ it "returns an enumerator over all key value pairs" do
29
+ Set[*@set.each.to_a.flatten].should == Set["A", "B", "C"]
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ describe "#empty?" do
6
+
7
+ [
8
+ [[], true],
9
+ [["A"], false],
10
+ [["A", "B", "C"], false],
11
+ ].each do |values, result|
12
+
13
+ it "returns #{result} for #{values.inspect}" do
14
+ Hamster.set(*values).empty?.should == result
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ [:eql?, :==].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ [
10
+ [[], [], true],
11
+ [["A"], [], false],
12
+ [[], ["A"], false],
13
+ [["A"], ["A"], true],
14
+ [["A"], ["B"], false],
15
+ [["A", "B"], ["A"], false],
16
+ [["A"], ["A", "B"], false],
17
+ [["A", "B", "C"], ["A", "B", "C"], true],
18
+ [["C", "A", "B"], ["A", "B", "C"], true],
19
+ ].each do |a, b, result|
20
+
21
+ it "returns #{result} for #{a.inspect} and #{b.inspect}" do
22
+ Hamster.set(*a).send(method, Hamster.set(*b)).should == result
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::Set do
4
+
5
+ [:filter, :select].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ before do
10
+ @original = Hamster.set("A", "B", "C")
11
+ end
12
+
13
+ describe "when everything matches" do
14
+
15
+ before do
16
+ @result = @original.send(method) { |item| true }
17
+ end
18
+
19
+ it "returns self" do
20
+ @result.should equal(@original)
21
+ end
22
+
23
+ end
24
+
25
+ describe "when only some things match" do
26
+
27
+ describe "with a block" do
28
+
29
+ before do
30
+ @result = @original.send(method) { |item| item == "A" }
31
+ end
32
+
33
+ it "preserves the original" do
34
+ @original.should == Hamster.set("A", "B", "C")
35
+ end
36
+
37
+ it "returns a set with the matching values" do
38
+ @result.should == Hamster.set("A")
39
+ end
40
+
41
+ end
42
+
43
+ describe "with no block" do
44
+
45
+ before do
46
+ @enumerator = @original.send(method)
47
+ end
48
+
49
+ it "returns an enumerator over the values" do
50
+ Hamster.set(*@enumerator.to_a).should == Hamster.set("A", "B", "C")
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end