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
@@ -4,38 +4,38 @@ describe Hamster::List do
4
4
 
5
5
  describe "#each" do
6
6
 
7
- before do
8
- @expected_values = (0..100).to_a
9
- @list = Hamster::List.new
10
- @expected_values.reverse.each { |value| @list = @list.cons(value) }
11
- end
7
+ [
8
+ [],
9
+ ["A"],
10
+ ["A", "B", "C"],
11
+ ].each do |values|
12
12
 
13
- describe "with a block (internal iteration)" do
13
+ describe "on #{values.inspect}" do
14
14
 
15
- it "returns self" do
16
- @list.each {}.should equal(@list)
17
- end
15
+ list = Hamster.list(*values)
16
+
17
+ describe "with a block" do
18
+
19
+ it "iterates over the items in order" do
20
+ items = []
21
+ list.each { |value| items << value }
22
+ items.should == values
23
+ end
24
+
25
+ it "returns nil" do
26
+ list.each {}.should be_nil
27
+ end
18
28
 
19
- it "yields all key value pairs" do
20
- actual_values = []
21
- @list.each do |value|
22
- actual_values << value
23
29
  end
24
- actual_values.should == @expected_values
25
- end
26
30
 
27
- end
31
+ describe "without a block" do
28
32
 
29
- describe "with no block (external iteration)" do
33
+ it "returns self" do
34
+ list.each.should == list
35
+ end
30
36
 
31
- it "returns an enumerator over all key value pairs" do
32
- actual_values = []
33
- enum = @list.each
34
- loop do
35
- value = enum.next
36
- actual_values << value
37
37
  end
38
- actual_values.should == @expected_values
38
+
39
39
  end
40
40
 
41
41
  end
@@ -4,13 +4,22 @@ describe Hamster::List do
4
4
 
5
5
  describe "#empty?" do
6
6
 
7
- it "initially returns true" do
8
- Hamster::List.new.should be_empty
9
- end
7
+ [
8
+ [[], true],
9
+ [["A"], false],
10
+ [["A", "B", "C"], false],
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.empty?.should == result
19
+ end
20
+
21
+ end
10
22
 
11
- it "returns false once items have been added" do
12
- list = Hamster::List.new.cons("A")
13
- list.should_not be_empty
14
23
  end
15
24
 
16
25
  end
@@ -2,15 +2,35 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Hamster::List do
4
4
 
5
- describe "#eql?" do
5
+ [:eql?, :==].each do |method|
6
6
 
7
- it "is true for the same instance" do
8
- list = Hamster::List.new
9
- list.should eql(list)
10
- end
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"], false],
19
+ ].each do |a, b, result|
20
+
21
+ describe "on #{a.inspect} and #{b.inspect}" do
22
+
23
+ a = Hamster.list(*a)
24
+ b = Hamster.list(*b)
25
+
26
+ it "returns #{result}" do
27
+ a.send(method, b).should == result
28
+ end
29
+
30
+ end
31
+
32
+ end
11
33
 
12
- it "is true for two empty instances" do
13
- Hamster::List.new.should eql(Hamster::List.new)
14
34
  end
15
35
 
16
36
  end
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ [:filter, :select].each do |method|
6
+
7
+ describe "#filter" do
8
+
9
+ [
10
+ [[], []],
11
+ [["A"], ["A"]],
12
+ [["A", "B", "C"], ["A", "B", "C"]],
13
+ [["A", "b", "C"], ["A", "C"]],
14
+ [["a", "b", "c"], []],
15
+ ].each do |values, result|
16
+
17
+ describe "on #{values.inspect}" do
18
+
19
+ list = Hamster.list(*values)
20
+
21
+ describe "with a block" do
22
+
23
+ it "returns #{result}" do
24
+ list.send(method) { |item| item == item.upcase }.should == Hamster.list(*result)
25
+ end
26
+
27
+ it "is lazy" do
28
+ count = 0
29
+ list.send(method) { |item| count += 1; true }
30
+ count.should <= 1
31
+ end
32
+
33
+ end
34
+
35
+ describe "without a block" do
36
+
37
+ it "returns self" do
38
+ list.send(method).should == list
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#head" do
6
+
7
+ [
8
+ [[], nil],
9
+ [["A"], "A"],
10
+ [["A", "B", "C"], "A"],
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.head.should == result
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ [:include?, :member?].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ [
10
+ [[], "A", false],
11
+ [[], nil, false],
12
+ [["A"], "A", true],
13
+ [["A"], "B", false],
14
+ [["A"], nil, false],
15
+ [["A", "B", nil], "A", true],
16
+ [["A", "B", nil], "B", true],
17
+ [["A", "B", nil], nil, true],
18
+ [["A", "B", nil], "C", false],
19
+ ].each do |values, item, result|
20
+
21
+ describe "on #{values.inspect}" do
22
+
23
+ list = Hamster.list(*values)
24
+
25
+ it "returns #{result}" do
26
+ list.send(method, item).should == result
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "laziness" do
6
+
7
+ def prime?(n)
8
+ 2.upto(Math.sqrt(n).round) { |i| return false if n % i == 0 }
9
+ true
10
+ end
11
+
12
+ it "primes" do
13
+ numbers = Hamster.interval(10000, 1000000)
14
+ primes = numbers.filter { |i| prime?(i) }
15
+ primes.take(3)
16
+
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -4,34 +4,36 @@ describe Hamster::List do
4
4
 
5
5
  describe "#map" do
6
6
 
7
- it "initially returns self" do
8
- list = Hamster::List.new
9
- list.map {}.should equal(list)
10
- end
7
+ [
8
+ [[], []],
9
+ [["A"], ["a"]],
10
+ [["A", "B", "C"], ["a", "b", "c"]],
11
+ ].each do |values, result|
11
12
 
12
- describe "when not empty" do
13
+ describe "on #{values.inspect}" do
13
14
 
14
- before do
15
- @original = Hamster::List.new.cons(1).cons(2).cons(3).cons(4)
16
- @copy = @original.map { |i| i + 5 }
17
- end
15
+ list = Hamster.list(*values)
18
16
 
19
- it "returns a modified copy" do
20
- @copy.should_not equal(@original)
21
- end
17
+ describe "with a block" do
22
18
 
23
- describe "the original" do
19
+ it "returns #{result}" do
20
+ list.map { |item| item.downcase }.should == Hamster.list(*result)
21
+ end
22
+
23
+ it "is lazy" do
24
+ count = 0
25
+ list.map { |item| count += 1 }
26
+ count.should <= 1
27
+ end
24
28
 
25
- it "has the original values" do
26
- @original.to_enum.to_a.should == [4, 3, 2, 1]
27
29
  end
28
30
 
29
- end
31
+ describe "without a block" do
30
32
 
31
- describe "the modified copy" do
33
+ it "returns self" do
34
+ list.map.should == list
35
+ end
32
36
 
33
- it "has the mapped values" do
34
- @copy.to_enum.to_a.should == [9, 8, 7, 6]
35
37
  end
36
38
 
37
39
  end
@@ -2,26 +2,38 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Hamster::List do
4
4
 
5
- describe "#reduce" do
5
+ [:reduce, :inject].each do |method|
6
6
 
7
- it "initially returns memo" do
8
- Hamster::List.new.reduce(0).should == 0
9
- end
10
-
11
- describe "with values" do
7
+ describe "##{method}" do
12
8
 
13
- before do
14
- @list = Hamster::List.new.cons(1).cons(2).cons(3).cons(4)
15
- end
9
+ [
10
+ [[], "@"],
11
+ [["A"], "@a"],
12
+ [["A", "B", "C"], "@abc"],
13
+ ].each do |values, result|
16
14
 
17
- it "works with an initial value" do
18
- @list.reduce(0) { |memo, i| memo + i }.should == 10
19
- end
15
+ describe "on #{values.inspect}" do
16
+
17
+ list = Hamster.list(*values)
18
+
19
+ describe "with a block" do
20
+
21
+ it "returns #{result.inspect}" do
22
+ list.send(method, "@") { |memo, item| memo << item.downcase }.should == result
23
+ end
24
+
25
+ end
26
+
27
+ describe "without a block" do
28
+
29
+ it "returns the memo" do
30
+ list.send(method, "@").should == "@"
31
+ end
32
+
33
+ end
20
34
 
21
- it "defaults to the first item in the list" do
22
- pending do
23
- @list.reduce { |memo, i| memo + i }.should == 10
24
35
  end
36
+
25
37
  end
26
38
 
27
39
  end
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ describe "#reject" do
6
+
7
+ [
8
+ [[], []],
9
+ [["A"], ["A"]],
10
+ [["A", "B", "C"], ["A", "B", "C"]],
11
+ [["A", "b", "C"], ["A", "C"]],
12
+ [["a", "b", "c"], []],
13
+ ].each do |values, result|
14
+
15
+ describe "on #{values.inspect}" do
16
+
17
+ list = Hamster.list(*values)
18
+
19
+ describe "with a block" do
20
+
21
+ it "returns #{result}" do
22
+ list.reject { |item| item == item.downcase }.should == Hamster.list(*result)
23
+ end
24
+
25
+ it "is lazy" do
26
+ count = 0
27
+ list.reject { |item| count += 1; false }
28
+ count.should <= 1
29
+ end
30
+
31
+ end
32
+
33
+ describe "without a block" do
34
+
35
+ it "returns self" do
36
+ list.reject.should == list
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Hamster::List do
4
+
5
+ [:size, :length].each do |method|
6
+
7
+ describe "##{method}" do
8
+
9
+ [
10
+ [[], 0],
11
+ [["A"], 1],
12
+ [["A", "B", "C"], 3],
13
+ ].each do |values, result|
14
+
15
+ describe "on #{values.inspect}" do
16
+
17
+ list = Hamster.list(*values)
18
+
19
+ it "returns #{result}" do
20
+ list.send(method).should == result
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end