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
@@ -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