hamster 0.1.8 → 0.1.11

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