hamster 0.1.19 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. data/History.rdoc +10 -0
  2. data/README.rdoc +1 -1
  3. data/lib/hamster/list.rb +19 -1
  4. data/lib/hamster/stack.rb +4 -0
  5. data/lib/hamster/version.rb +1 -1
  6. data/spec/hamster/hash/all_spec.rb +5 -5
  7. data/spec/hamster/hash/any_spec.rb +5 -5
  8. data/spec/hamster/hash/eql_spec.rb +2 -2
  9. data/spec/hamster/hash/has_key_spec.rb +2 -2
  10. data/spec/hamster/hash/none_spec.rb +5 -5
  11. data/spec/hamster/list/all_spec.rb +44 -12
  12. data/spec/hamster/list/any_spec.rb +8 -8
  13. data/spec/hamster/list/append_spec.rb +2 -2
  14. data/spec/hamster/list/break_spec.rb +183 -0
  15. data/spec/hamster/list/cadr_spec.rb +7 -2
  16. data/spec/hamster/list/clear_spec.rb +36 -0
  17. data/spec/hamster/list/copying_spec.rb +3 -2
  18. data/spec/hamster/list/cycle_spec.rb +20 -7
  19. data/spec/hamster/list/drop_spec.rb +10 -5
  20. data/spec/hamster/list/drop_while_spec.rb +17 -5
  21. data/spec/hamster/list/each_spec.rb +15 -8
  22. data/spec/hamster/list/empty_spec.rb +2 -2
  23. data/spec/hamster/list/eql_spec.rb +6 -6
  24. data/spec/hamster/list/filter_spec.rb +14 -6
  25. data/spec/hamster/list/find_spec.rb +2 -2
  26. data/spec/hamster/list/grep_spec.rb +10 -5
  27. data/spec/hamster/list/head_spec.rb +16 -12
  28. data/spec/hamster/list/include_spec.rb +2 -2
  29. data/spec/hamster/list/inspect_spec.rb +2 -2
  30. data/spec/hamster/list/map_spec.rb +18 -6
  31. data/spec/hamster/list/maximum_spec.rb +2 -2
  32. data/spec/hamster/list/minimum_spec.rb +2 -2
  33. data/spec/hamster/list/none_spec.rb +8 -8
  34. data/spec/hamster/list/one_spec.rb +9 -9
  35. data/spec/hamster/list/partition_spec.rb +87 -39
  36. data/spec/hamster/list/reduce_spec.rb +2 -2
  37. data/spec/hamster/list/reject_spec.rb +14 -6
  38. data/spec/hamster/list/reverse_spec.rb +9 -4
  39. data/spec/hamster/list/size_spec.rb +2 -2
  40. data/spec/hamster/list/span_spec.rb +183 -0
  41. data/spec/hamster/list/split_at_spec.rb +68 -17
  42. data/spec/hamster/list/tail_spec.rb +2 -2
  43. data/spec/hamster/list/take_spec.rb +10 -5
  44. data/spec/hamster/list/take_while_spec.rb +15 -6
  45. data/spec/hamster/list/to_a_spec.rb +2 -2
  46. data/spec/hamster/list/to_ary_spec.rb +3 -3
  47. data/spec/hamster/list/to_list_spec.rb +3 -2
  48. data/spec/hamster/list/zip_spec.rb +16 -7
  49. data/spec/hamster/set/all_spec.rb +6 -6
  50. data/spec/hamster/set/any_spec.rb +6 -6
  51. data/spec/hamster/set/eql_spec.rb +2 -2
  52. data/spec/hamster/set/include_spec.rb +2 -2
  53. data/spec/hamster/set/none_spec.rb +6 -6
  54. data/spec/hamster/set/to_list.rb +1 -1
  55. data/spec/hamster/stack/clear_spec.rb +36 -0
  56. data/spec/hamster/stack/eql_spec.rb +2 -2
  57. data/spec/hamster/stack/pop_spec.rb +2 -2
  58. data/spec/hamster/trie/remove_spec.rb +3 -3
  59. data/spec/spec_helper.rb +2 -0
  60. metadata +9 -89
  61. data/lib/hamster/core_ext/enumerable.rbc +0 -481
  62. data/lib/hamster/core_ext/io.rbc +0 -604
  63. data/lib/hamster/hash.rbc +0 -3117
  64. data/lib/hamster/list.rbc +0 -7274
  65. data/lib/hamster/set.rbc +0 -3152
  66. data/lib/hamster/stack.rbc +0 -1358
  67. data/lib/hamster/trie.rbc +0 -3416
  68. data/spec/hamster/core_ext/enumerable_spec.rbc +0 -747
  69. data/spec/hamster/core_ext/io_spec.rbc +0 -409
  70. data/spec/hamster/hash/all_spec.rbc +0 -1214
  71. data/spec/hamster/hash/any_spec.rbc +0 -1495
  72. data/spec/hamster/hash/construction_spec.rbc +0 -742
  73. data/spec/hamster/hash/copying_spec.rbc +0 -519
  74. data/spec/hamster/hash/each_spec.rbc +0 -908
  75. data/spec/hamster/hash/empty_spec.rbc +0 -517
  76. data/spec/hamster/hash/eql_spec.rbc +0 -1702
  77. data/spec/hamster/hash/filter_spec.rbc +0 -1433
  78. data/spec/hamster/hash/get_spec.rbc +0 -791
  79. data/spec/hamster/hash/has_key_spec.rbc +0 -719
  80. data/spec/hamster/hash/map_spec.rbc +0 -1454
  81. data/spec/hamster/hash/none_spec.rbc +0 -1399
  82. data/spec/hamster/hash/put_spec.rbc +0 -1334
  83. data/spec/hamster/hash/reduce_spec.rbc +0 -1234
  84. data/spec/hamster/hash/reject_spec.rbc +0 -1445
  85. data/spec/hamster/hash/remove_spec.rbc +0 -1135
  86. data/spec/hamster/hash/size_spec.rbc +0 -596
  87. data/spec/hamster/list/all_spec.rbc +0 -1760
  88. data/spec/hamster/list/any_spec.rbc +0 -1888
  89. data/spec/hamster/list/append_spec.rbc +0 -1555
  90. data/spec/hamster/list/cadr_spec.rbc +0 -855
  91. data/spec/hamster/list/cons_spec.rbc +0 -848
  92. data/spec/hamster/list/construction_spec.rbc +0 -1732
  93. data/spec/hamster/list/copying_spec.rbc +0 -555
  94. data/spec/hamster/list/drop_spec.rbc +0 -1081
  95. data/spec/hamster/list/drop_while_spec.rbc +0 -1286
  96. data/spec/hamster/list/each_spec.rbc +0 -1365
  97. data/spec/hamster/list/empty_spec.rbc +0 -571
  98. data/spec/hamster/list/eql_spec.rbc +0 -1819
  99. data/spec/hamster/list/filter_spec.rbc +0 -1595
  100. data/spec/hamster/list/find_spec.rbc +0 -1456
  101. data/spec/hamster/list/head_spec.rbc +0 -575
  102. data/spec/hamster/list/include_spec.rbc +0 -1173
  103. data/spec/hamster/list/inspect_spec.rbc +0 -995
  104. data/spec/hamster/list/map_spec.rbc +0 -1545
  105. data/spec/hamster/list/none_spec.rbc +0 -1788
  106. data/spec/hamster/list/partition_spec.rbc +0 -2715
  107. data/spec/hamster/list/reduce_spec.rbc +0 -2081
  108. data/spec/hamster/list/reject_spec.rbc +0 -1590
  109. data/spec/hamster/list/reverse_spec.rbc +0 -1061
  110. data/spec/hamster/list/size_spec.rbc +0 -1063
  111. data/spec/hamster/list/tail_spec.rbc +0 -595
  112. data/spec/hamster/list/take_spec.rbc +0 -1075
  113. data/spec/hamster/list/take_while_spec.rbc +0 -1446
  114. data/spec/hamster/list/to_a_spec.rbc +0 -961
  115. data/spec/hamster/list/to_ary_spec.rbc +0 -1080
  116. data/spec/hamster/set/add_spec.rbc +0 -1039
  117. data/spec/hamster/set/all_spec.rbc +0 -1316
  118. data/spec/hamster/set/any_spec.rbc +0 -1444
  119. data/spec/hamster/set/construction_spec.rbc +0 -422
  120. data/spec/hamster/set/copying_spec.rbc +0 -469
  121. data/spec/hamster/set/each_spec.rbc +0 -820
  122. data/spec/hamster/set/empty_spec.rbc +0 -452
  123. data/spec/hamster/set/eql_spec.rbc +0 -1309
  124. data/spec/hamster/set/filter_spec.rbc +0 -1272
  125. data/spec/hamster/set/include_spec.rbc +0 -657
  126. data/spec/hamster/set/map_spec.rbc +0 -1285
  127. data/spec/hamster/set/none_spec.rbc +0 -1344
  128. data/spec/hamster/set/reduce_spec.rbc +0 -1177
  129. data/spec/hamster/set/reject_spec.rbc +0 -1273
  130. data/spec/hamster/set/remove_spec.rbc +0 -947
  131. data/spec/hamster/set/size_spec.rbc +0 -531
  132. data/spec/hamster/set/to_a_spec.rbc +0 -559
  133. data/spec/hamster/stack/construction_spec.rbc +0 -862
  134. data/spec/hamster/stack/copying_spec.rbc +0 -555
  135. data/spec/hamster/stack/empty_spec.rbc +0 -571
  136. data/spec/hamster/stack/eql_spec.rbc +0 -1281
  137. data/spec/hamster/stack/inspect_spec.rbc +0 -586
  138. data/spec/hamster/stack/pop_spec.rbc +0 -1099
  139. data/spec/hamster/stack/push_spec.rbc +0 -848
  140. data/spec/hamster/stack/size_spec.rbc +0 -650
  141. data/spec/hamster/stack/top_spec.rbc +0 -676
  142. data/spec/hamster/trie/remove_spec.rbc +0 -40
  143. data/spec/spec_helper.rbc +0 -163
  144. data/tasks/spec.rbc +0 -201
@@ -9,11 +9,11 @@ describe Hamster::List do
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
11
11
  it "stream" do
12
- @list = Hamster.interval(0, 10000)
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
13
  end
14
14
 
15
15
  it "list" do
16
- @list = (0..10000).reduce(Hamster.list) { |list, i| list.cons(i) }
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
17
  end
18
18
 
19
19
  after do
@@ -31,11 +31,16 @@ describe Hamster::List do
31
31
  describe "on #{values.inspect}" do
32
32
 
33
33
  before do
34
- @list = Hamster.list(*values)
34
+ @original = Hamster.list(*values)
35
+ @result = @original.reverse { |item| item.downcase }
36
+ end
37
+
38
+ it "preserves the original" do
39
+ @original.should == Hamster.list(*values)
35
40
  end
36
41
 
37
42
  it "returns #{expected.inspect}" do
38
- @list.reverse { |item| item.downcase }.should == Hamster.list(*expected)
43
+ @result.should == Hamster.list(*expected)
39
44
  end
40
45
 
41
46
  end
@@ -11,11 +11,11 @@ describe Hamster::List do
11
11
  describe "doesn't run out of stack space on a really big" do
12
12
 
13
13
  it "stream" do
14
- @list = Hamster.interval(0, 10000)
14
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
15
15
  end
16
16
 
17
17
  it "list" do
18
- @list = (0..10000).reduce(Hamster.list) { |list, i| list.cons(i) }
18
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
19
19
  end
20
20
 
21
21
  after do
@@ -0,0 +1,183 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ shared_examples_for "#span without a block" do
8
+
9
+ describe "without a block" do
10
+
11
+ before do
12
+ @result = @original.span
13
+ @prefix = @result.car
14
+ @remainder = @result.cadr
15
+ end
16
+
17
+ it "returns a list with two items" do
18
+ @result.size.should == 2
19
+ end
20
+
21
+ it "returns self as the prefix" do
22
+ @prefix.should equal(@original)
23
+ end
24
+
25
+ it "leaves the remainder empty" do
26
+ @remainder.should be_empty
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ shared_examples_for "#span is lazy" do
34
+
35
+ it "is lazy" do
36
+ count = 0
37
+ @original.span { |item| count += 1; true }
38
+ count.should <= 1
39
+ end
40
+
41
+ end
42
+
43
+ describe "#span" do
44
+
45
+ describe "doesn't run out of stack space on a really big" do
46
+
47
+ it "stream" do
48
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
49
+ end
50
+
51
+ it "list" do
52
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
53
+ end
54
+
55
+ after do
56
+ @list.span { |item| item < 5000 }
57
+ end
58
+
59
+ end
60
+
61
+ describe "on a stream" do
62
+
63
+ before do
64
+ count = 0
65
+ @original = Hamster.stream { count += 1 }
66
+ end
67
+
68
+ describe "with a block" do
69
+
70
+ before do
71
+ @result = @original.span { |item| item <= 5 }
72
+ @prefix = @result.car
73
+ @remainder = @result.cadr
74
+ end
75
+
76
+ it "returns a list with two items" do
77
+ @result.size.should == 2
78
+ end
79
+
80
+ it "correctly identifies the prefix" do
81
+ @prefix.should == Hamster.list(1, 2, 3, 4, 5)
82
+ end
83
+
84
+ it "correctly identifies the remainder" do
85
+ @remainder.take(5).should == Hamster.list(6, 7, 8, 9, 10)
86
+ end
87
+
88
+ end
89
+
90
+ it_should_behave_like "#span without a block"
91
+
92
+ it_should_behave_like "#span is lazy"
93
+
94
+ end
95
+
96
+ describe "on an interval" do
97
+
98
+ before do
99
+ @original = Hamster.interval(1, 10)
100
+ end
101
+
102
+ describe "with a block" do
103
+
104
+ before do
105
+ @result = @original.span { |item| item <= 5 }
106
+ @prefix = @result.car
107
+ @remainder = @result.cadr
108
+ end
109
+
110
+ it "returns a list with two items" do
111
+ @result.size.should == 2
112
+ end
113
+
114
+ it "correctly identifies the prefix" do
115
+ @prefix.should == Hamster.list(1, 2, 3, 4, 5)
116
+ end
117
+
118
+ it "correctly identifies the remainder" do
119
+ @remainder.should == Hamster.list(6, 7, 8, 9, 10)
120
+ end
121
+
122
+ end
123
+
124
+ it_should_behave_like "#span without a block"
125
+
126
+ it_should_behave_like "#span is lazy"
127
+
128
+ end
129
+
130
+ [
131
+ [[], [], []],
132
+ [[1], [1], []],
133
+ [[1, 2], [1, 2], []],
134
+ [[1, 2, 3], [1, 2], [3]],
135
+ [[1, 2, 3, 4], [1, 2], [3, 4]],
136
+ [[2, 3, 4], [2], [3, 4]],
137
+ [[3, 4], [], [3, 4]],
138
+ [[4], [], [4]],
139
+ ].each do |values, expected_prefix, expected_remainder|
140
+
141
+ describe "on #{values.inspect}" do
142
+
143
+ before do
144
+ @original = Hamster.list(*values)
145
+ end
146
+
147
+ describe "with a block" do
148
+
149
+ before do
150
+ @result = @original.span { |item| item <= 2 }
151
+ @prefix = @result.car
152
+ @remainder = @result.cadr
153
+ end
154
+
155
+ it "preserves the original" do
156
+ @original.should == Hamster.list(*values)
157
+ end
158
+
159
+ it "returns a list with two items" do
160
+ @result.size.should == 2
161
+ end
162
+
163
+ it "correctly identifies the prefix" do
164
+ @prefix.should == Hamster.list(*expected_prefix)
165
+ end
166
+
167
+ it "correctly identifies the remainder" do
168
+ @remainder.should == Hamster.list(*expected_remainder)
169
+ end
170
+
171
+ end
172
+
173
+ it_should_behave_like "#span without a block"
174
+
175
+ it_should_behave_like "#span is lazy"
176
+
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+
183
+ end
@@ -9,44 +9,58 @@ describe Hamster::List do
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
11
11
  it "stream" do
12
- @list = Hamster.interval(0, 10000)
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
13
  end
14
14
 
15
15
  it "list" do
16
- @list = (0..10000).reduce(Hamster.list) { |list, i| list.cons(i) }
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
17
  end
18
18
 
19
19
  after do
20
- @list.split_at(5000)
20
+ @list.split_at(STACK_OVERFLOW_DEPTH)
21
21
  end
22
22
 
23
23
  end
24
24
 
25
- describe "on an empty list" do
25
+ describe "on a stream" do
26
26
 
27
27
  before do
28
- splits = Hamster.list.split_at(4)
29
- @prefix = splits.car
30
- @remainder = splits.cadr
28
+ count = 0
29
+ counter = Hamster.stream { count += 1 }
30
+ @result = counter.split_at(5)
31
+ @prefix = @result.car
32
+ @remainder = @result.cadr
31
33
  end
32
34
 
33
- it "returns the empty list for the prefix" do
34
- @prefix.should equal(Hamster.list)
35
+ it "returns a list with two items" do
36
+ @result.size.should == 2
35
37
  end
36
38
 
37
- it "returns the empty list for the remainder" do
38
- @remainder.should equal(Hamster.list)
39
+ it "correctly identifies the prefix" do
40
+ @prefix.should == Hamster.list(1, 2, 3, 4, 5)
41
+ end
42
+
43
+ it "correctly identifies the remainder" do
44
+ @remainder.take(5).should == Hamster.list(6, 7, 8, 9, 10)
39
45
  end
40
46
 
41
47
  end
42
48
 
43
- describe "on a non-empty list" do
49
+ describe "on an interval" do
44
50
 
45
51
  before do
46
- interval = Hamster.interval(1, 11)
47
- splits = interval.split_at(5)
48
- @prefix = splits.car
49
- @remainder = splits.cadr
52
+ @original = Hamster.interval(1, 10)
53
+ @result = @original.split_at(5)
54
+ @prefix = @result.car
55
+ @remainder = @result.cadr
56
+ end
57
+
58
+ it "preserves the original" do
59
+ @original.should == Hamster.interval(1, 10)
60
+ end
61
+
62
+ it "returns a list with two items" do
63
+ @result.size.should == 2
50
64
  end
51
65
 
52
66
  it "correctly identifies the prefix" do
@@ -54,7 +68,44 @@ describe Hamster::List do
54
68
  end
55
69
 
56
70
  it "correctly identifies the remainder" do
57
- @remainder.should == Hamster.list(6, 7, 8, 9, 10, 11)
71
+ @remainder.should == Hamster.list(6, 7, 8, 9, 10)
72
+ end
73
+
74
+ end
75
+
76
+ [
77
+ [[], [], []],
78
+ [[1], [1], []],
79
+ [[1, 2], [1, 2], []],
80
+ [[1, 2, 3], [1, 2], [3]],
81
+ [[1, 2, 3, 4], [1, 2], [3, 4]],
82
+ ].each do |values, expected_prefix, expected_remainder|
83
+
84
+ describe "on #{values.inspect}" do
85
+
86
+ before do
87
+ @original = Hamster.list(*values)
88
+ @result = @original.split_at(2)
89
+ @prefix = @result.car
90
+ @remainder = @result.cadr
91
+ end
92
+
93
+ it "preserves the original" do
94
+ @original.should == Hamster.list(*values)
95
+ end
96
+
97
+ it "returns a list with two items" do
98
+ @result.size.should == 2
99
+ end
100
+
101
+ it "correctly identifies the matches" do
102
+ @prefix.should == Hamster.list(*expected_prefix)
103
+ end
104
+
105
+ it "correctly identifies the remainder" do
106
+ @remainder.should == Hamster.list(*expected_remainder)
107
+ end
108
+
58
109
  end
59
110
 
60
111
  end
@@ -15,11 +15,11 @@ describe Hamster::List do
15
15
  describe "on #{values.inspect}" do
16
16
 
17
17
  before do
18
- @list = Hamster.list(*values)
18
+ @result = Hamster.list(*values).tail
19
19
  end
20
20
 
21
21
  it "returns #{expected.inspect}" do
22
- @list.tail.should == Hamster.list(*expected)
22
+ @result.should == Hamster.list(*expected)
23
23
  end
24
24
 
25
25
  end
@@ -9,15 +9,15 @@ describe Hamster::List do
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
11
11
  it "stream" do
12
- @list = Hamster.interval(0, 10000)
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
13
  end
14
14
 
15
15
  it "list" do
16
- @list = (0..10000).reduce(Hamster.list) { |list, i| list.cons(i) }
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
17
  end
18
18
 
19
19
  after do
20
- @list.take(10000)
20
+ @list.take(STACK_OVERFLOW_DEPTH)
21
21
  end
22
22
 
23
23
  end
@@ -33,11 +33,16 @@ describe Hamster::List do
33
33
  describe "#{number} from #{values.inspect}" do
34
34
 
35
35
  before do
36
- @list = Hamster.list(*values)
36
+ @original = Hamster.list(*values)
37
+ @result = @original.take(number)
38
+ end
39
+
40
+ it "preserves the original" do
41
+ @original.should == Hamster.list(*values)
37
42
  end
38
43
 
39
44
  it "returns #{expected.inspect}" do
40
- @list.take(number).should == Hamster.list(*expected)
45
+ @result.should == Hamster.list(*expected)
41
46
  end
42
47
 
43
48
  end
@@ -9,11 +9,11 @@ describe Hamster::List do
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
11
11
  it "stream" do
12
- @list = Hamster.interval(0, 10000)
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
13
  end
14
14
 
15
15
  it "list" do
16
- @list = (0..10000).reduce(Hamster.list) { |list, i| list.cons(i) }
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
17
  end
18
18
 
19
19
  after do
@@ -31,18 +31,23 @@ describe Hamster::List do
31
31
  describe "on #{values.inspect}" do
32
32
 
33
33
  before do
34
- @list = Hamster.list(*values)
34
+ @original = Hamster.list(*values)
35
+ @result = @original.take_while { |item| item < "C" }
35
36
  end
36
37
 
37
38
  describe "with a block" do
38
39
 
39
40
  it "returns #{expected.inspect}" do
40
- @list.take_while { |item| item < "C" }.should == Hamster.list(*expected)
41
+ @result.should == Hamster.list(*expected)
42
+ end
43
+
44
+ it "preserves the original" do
45
+ @original.should == Hamster.list(*values)
41
46
  end
42
47
 
43
48
  it "is lazy" do
44
49
  count = 0
45
- @list.take_while { |item| count += 1; true }
50
+ @original.take_while { |item| count += 1; true }
46
51
  count.should <= 1
47
52
  end
48
53
 
@@ -50,8 +55,12 @@ describe Hamster::List do
50
55
 
51
56
  describe "without a block" do
52
57
 
58
+ before do
59
+ @result = @original.take_while
60
+ end
61
+
53
62
  it "returns self" do
54
- @list.take_while.should equal(@list)
63
+ @result.should equal(@original)
55
64
  end
56
65
 
57
66
  end