hamster 0.1.23 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +26 -0
- data/README.rdoc +1 -1
- data/lib/hamster.rb +1 -1
- data/lib/hamster/core_ext/io.rb +7 -5
- data/lib/hamster/hash.rb +31 -29
- data/lib/hamster/list.rb +203 -128
- data/lib/hamster/set.rb +39 -25
- data/lib/hamster/stack.rb +9 -5
- data/lib/hamster/trie.rb +5 -1
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/hash/all_spec.rb +29 -25
- data/spec/hamster/hash/reduce_spec.rb +1 -1
- data/spec/hamster/hash/uniq_spec.rb +23 -0
- data/spec/hamster/list/all_spec.rb +55 -55
- data/spec/hamster/list/any_spec.rb +4 -8
- data/spec/hamster/list/append_spec.rb +2 -20
- data/spec/hamster/list/break_spec.rb +22 -121
- data/spec/hamster/list/cadr_spec.rb +4 -0
- data/spec/hamster/list/chunk_spec.rb +6 -0
- data/spec/hamster/list/combinations_spec.rb +51 -0
- data/spec/hamster/list/count_spec.rb +4 -8
- data/spec/hamster/list/cycle_spec.rb +5 -24
- data/spec/hamster/list/drop_spec.rb +2 -14
- data/spec/hamster/list/drop_while_spec.rb +2 -14
- data/spec/hamster/list/each_spec.rb +4 -8
- data/spec/hamster/list/eql_spec.rb +9 -10
- data/spec/hamster/list/filter_spec.rb +2 -20
- data/spec/hamster/list/find_spec.rb +4 -8
- data/spec/hamster/list/grep_spec.rb +2 -20
- data/spec/hamster/list/include_spec.rb +4 -8
- data/spec/hamster/list/init_spec.rb +4 -0
- data/spec/hamster/list/inits_spec.rb +42 -0
- data/spec/hamster/list/inspect_spec.rb +4 -8
- data/spec/hamster/list/intersperse_spec.rb +2 -14
- data/spec/hamster/list/join_spec.rb +4 -8
- data/spec/hamster/list/last_spec.rb +4 -8
- data/spec/hamster/list/map_spec.rb +2 -14
- data/spec/hamster/list/maximum_spec.rb +4 -8
- data/spec/hamster/list/minimum_spec.rb +4 -8
- data/spec/hamster/list/none_spec.rb +4 -8
- data/spec/hamster/list/one_spec.rb +4 -8
- data/spec/hamster/list/partition_spec.rb +12 -111
- data/spec/hamster/list/product_spec.rb +4 -8
- data/spec/hamster/list/reduce_spec.rb +4 -8
- data/spec/hamster/list/remove_spec.rb +2 -14
- data/spec/hamster/list/reverse_spec.rb +4 -8
- data/spec/hamster/list/size_spec.rb +4 -8
- data/spec/hamster/list/sorting_spec.rb +2 -14
- data/spec/hamster/list/span_spec.rb +22 -121
- data/spec/hamster/list/split_at_spec.rb +2 -65
- data/spec/hamster/list/sum_spec.rb +4 -8
- data/spec/hamster/list/tails_spec.rb +42 -0
- data/spec/hamster/list/take_spec.rb +2 -14
- data/spec/hamster/list/take_while_spec.rb +2 -14
- data/spec/hamster/list/to_a_spec.rb +4 -8
- data/spec/hamster/list/to_ary_spec.rb +4 -8
- data/spec/hamster/list/union_spec.rb +1 -21
- data/spec/hamster/list/uniq_spec.rb +3 -15
- data/spec/hamster/list/zip_spec.rb +1 -21
- data/spec/hamster/set/all_spec.rb +33 -29
- data/spec/hamster/set/product_spec.rb +32 -0
- data/spec/hamster/set/sum_spec.rb +32 -0
- data/spec/hamster/set/uniq_spec.rb +1 -1
- data/spec/spec.opts +0 -1
- metadata +8 -2
@@ -8,18 +8,14 @@ describe Hamster::List do
|
|
8
8
|
|
9
9
|
describe "##{method}" do
|
10
10
|
|
11
|
-
describe "
|
11
|
+
describe "on a really big list" do
|
12
12
|
|
13
|
-
|
13
|
+
before do
|
14
14
|
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
15
15
|
end
|
16
16
|
|
17
|
-
it "
|
18
|
-
@list
|
19
|
-
end
|
20
|
-
|
21
|
-
after do
|
22
|
-
@list.any? { false }
|
17
|
+
it "doesn't run out of stack" do
|
18
|
+
lambda { @list.send(method) { false } }.should_not raise_error
|
23
19
|
end
|
24
20
|
|
25
21
|
end
|
@@ -8,20 +8,8 @@ describe Hamster::List do
|
|
8
8
|
|
9
9
|
describe "##{method}" do
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
it "stream" do
|
14
|
-
@a = @b = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "list" do
|
18
|
-
@a = @b = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
|
19
|
-
end
|
20
|
-
|
21
|
-
after do
|
22
|
-
@a.send(method, @b)
|
23
|
-
end
|
24
|
-
|
11
|
+
it "is lazy" do
|
12
|
+
lambda { Hamster.stream { fail }.append(Hamster.stream { fail }) }.should_not raise_error
|
25
13
|
end
|
26
14
|
|
27
15
|
[
|
@@ -55,12 +43,6 @@ describe Hamster::List do
|
|
55
43
|
|
56
44
|
end
|
57
45
|
|
58
|
-
it "is lazy" do
|
59
|
-
count = 0
|
60
|
-
Hamster.stream { count += 1 }.append(Hamster.list("A"))
|
61
|
-
count.should <= 1
|
62
|
-
end
|
63
|
-
|
64
46
|
end
|
65
47
|
|
66
48
|
end
|
@@ -4,127 +4,10 @@ require 'hamster/list'
|
|
4
4
|
|
5
5
|
describe Hamster::List do
|
6
6
|
|
7
|
-
shared_examples_for "#break without a block" do
|
8
|
-
|
9
|
-
describe "without a block" do
|
10
|
-
|
11
|
-
before do
|
12
|
-
@result = @original.break
|
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 "#break is lazy" do
|
34
|
-
|
35
|
-
it "is lazy" do
|
36
|
-
count = 0
|
37
|
-
@original.break { |item| count += 1; false }
|
38
|
-
count.should <= 1
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
7
|
describe "#break" do
|
44
8
|
|
45
|
-
|
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.break { |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.break { |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 "#break without a block"
|
91
|
-
|
92
|
-
it_should_behave_like "#break 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.break { |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 "#break without a block"
|
125
|
-
|
126
|
-
it_should_behave_like "#break is lazy"
|
127
|
-
|
9
|
+
it "is lazy" do
|
10
|
+
lambda { Hamster.stream { fail }.break { |item| false } }.should_not raise_error
|
128
11
|
end
|
129
12
|
|
130
13
|
[
|
@@ -170,9 +53,27 @@ describe Hamster::List do
|
|
170
53
|
|
171
54
|
end
|
172
55
|
|
173
|
-
|
56
|
+
describe "without a block" do
|
57
|
+
|
58
|
+
before do
|
59
|
+
@result = @original.break
|
60
|
+
@prefix = @result.car
|
61
|
+
@remainder = @result.cadr
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns a list with two items" do
|
65
|
+
@result.size.should == 2
|
66
|
+
end
|
67
|
+
|
68
|
+
it "returns self as the prefix" do
|
69
|
+
@prefix.should equal(@original)
|
70
|
+
end
|
174
71
|
|
175
|
-
|
72
|
+
it "leaves the remainder empty" do
|
73
|
+
@remainder.should be_empty
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
176
77
|
|
177
78
|
end
|
178
79
|
|
@@ -29,6 +29,10 @@ describe Hamster::List do
|
|
29
29
|
@result = @original.send(method)
|
30
30
|
end
|
31
31
|
|
32
|
+
it "responds to #{method}" do
|
33
|
+
@original.respond_to?(method, false).should == true
|
34
|
+
end
|
35
|
+
|
32
36
|
it "preserves the original" do
|
33
37
|
@original.should == Hamster.list(*values)
|
34
38
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
require 'hamster/list'
|
4
|
+
|
5
|
+
describe Hamster::List do
|
6
|
+
|
7
|
+
[:combinations, :combination].each do |method|
|
8
|
+
|
9
|
+
describe "##{method}" do
|
10
|
+
|
11
|
+
it "is lazy" do
|
12
|
+
lambda { Hamster.stream { fail }.combinations(2) }.should_not raise_error
|
13
|
+
end
|
14
|
+
|
15
|
+
[
|
16
|
+
[["A", "B", "C", "D"], 1, [["A"], ["B"], ["C"], ["D"]]],
|
17
|
+
[["A", "B", "C", "D"], 2, [["A", "B"], ["A", "C"], ["A", "D"], ["B", "C"], ["B", "D"], ["C", "D"]]],
|
18
|
+
[["A", "B", "C", "D"], 3, [["A", "B", "C"], ["A", "B", "D"], ["A", "C", "D"], ["B", "C", "D"]]],
|
19
|
+
[["A", "B", "C", "D"], 4, [["A", "B", "C", "D"]]],
|
20
|
+
[["A", "B", "C", "D"], 0, [[]]],
|
21
|
+
[["A", "B", "C", "D"], 5, []],
|
22
|
+
[[], 0, [[]]],
|
23
|
+
[[], 1, []],
|
24
|
+
].each do |values, number, expected|
|
25
|
+
|
26
|
+
expected = expected.map { |x| Hamster.list(*x) }
|
27
|
+
|
28
|
+
describe "on #{values.inspect} in groups of #{number}" do
|
29
|
+
|
30
|
+
before do
|
31
|
+
@original = Hamster.list(*values)
|
32
|
+
@result = @original.send(method, number)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "preserves the original" do
|
36
|
+
@original.should == Hamster.list(*values)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns #{expected.inspect}" do
|
40
|
+
@result.should == Hamster.list(*expected)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -6,18 +6,14 @@ describe Hamster::List do
|
|
6
6
|
|
7
7
|
describe "#count" do
|
8
8
|
|
9
|
-
describe "
|
9
|
+
describe "on a really big list" do
|
10
10
|
|
11
|
-
|
11
|
+
before do
|
12
12
|
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
13
13
|
end
|
14
14
|
|
15
|
-
it "
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
@list.count { true }
|
15
|
+
it "doesn't run out of stack" do
|
16
|
+
lambda { @list.count }.should_not raise_error
|
21
17
|
end
|
22
18
|
|
23
19
|
end
|
@@ -6,38 +6,19 @@ describe Hamster do
|
|
6
6
|
|
7
7
|
describe "#cycle" do
|
8
8
|
|
9
|
-
describe "doesn't run out of stack space on a really big" do
|
10
|
-
|
11
|
-
it "stream" do
|
12
|
-
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "list" do
|
16
|
-
@list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
@list.cycle
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
9
|
it "is lazy" do
|
26
|
-
|
27
|
-
list = Hamster.stream { count += 1 }
|
28
|
-
list.cycle
|
29
|
-
count.should <= 1
|
10
|
+
lambda { Hamster.stream { fail }.cycle }.should_not raise_error
|
30
11
|
end
|
31
12
|
|
32
13
|
describe "with an empty list" do
|
33
14
|
|
34
15
|
before do
|
35
|
-
|
36
|
-
@result =
|
16
|
+
original = Hamster.list
|
17
|
+
@result = original.cycle
|
37
18
|
end
|
38
19
|
|
39
|
-
it "returns
|
40
|
-
@result.should
|
20
|
+
it "returns an empty list" do
|
21
|
+
@result.should be_empty
|
41
22
|
end
|
42
23
|
|
43
24
|
end
|
@@ -6,20 +6,8 @@ describe Hamster::List do
|
|
6
6
|
|
7
7
|
describe "#drop" do
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
it "stream" do
|
12
|
-
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "list" do
|
16
|
-
@list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
@list.drop(STACK_OVERFLOW_DEPTH)
|
21
|
-
end
|
22
|
-
|
9
|
+
it "is lazy" do
|
10
|
+
lambda { Hamster.stream { fail }.drop(1) }.should_not raise_error
|
23
11
|
end
|
24
12
|
|
25
13
|
[
|
@@ -6,20 +6,8 @@ describe Hamster::List do
|
|
6
6
|
|
7
7
|
describe "#drop_while" do
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
it "stream" do
|
12
|
-
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "list" do
|
16
|
-
@list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
@list.drop_while { true }
|
21
|
-
end
|
22
|
-
|
9
|
+
it "is lazy" do
|
10
|
+
lambda { Hamster.stream { fail }.drop_while { false } }.should_not raise_error
|
23
11
|
end
|
24
12
|
|
25
13
|
[
|
@@ -8,18 +8,14 @@ describe Hamster::List do
|
|
8
8
|
|
9
9
|
describe "##{method}" do
|
10
10
|
|
11
|
-
describe "
|
11
|
+
describe "on a really big list" do
|
12
12
|
|
13
|
-
|
13
|
+
before do
|
14
14
|
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
15
15
|
end
|
16
16
|
|
17
|
-
it "
|
18
|
-
@list
|
19
|
-
end
|
20
|
-
|
21
|
-
after do
|
22
|
-
@list.send(method) { }
|
17
|
+
it "doesn't run out of stack" do
|
18
|
+
lambda { @list.send(method) { |item| } }.should_not raise_error
|
23
19
|
end
|
24
20
|
|
25
21
|
end
|
@@ -8,20 +8,15 @@ describe Hamster::List do
|
|
8
8
|
|
9
9
|
describe "##{method}" do
|
10
10
|
|
11
|
-
describe "
|
11
|
+
describe "on a really big list" do
|
12
12
|
|
13
|
-
|
13
|
+
before do
|
14
14
|
@a = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
15
15
|
@b = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
16
16
|
end
|
17
17
|
|
18
|
-
it "
|
19
|
-
@a
|
20
|
-
@b = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
|
21
|
-
end
|
22
|
-
|
23
|
-
after do
|
24
|
-
@a.send(method, @b)
|
18
|
+
it "doesn't run out of stack" do
|
19
|
+
lambda { @a.send(method, @b) }.should_not raise_error
|
25
20
|
end
|
26
21
|
|
27
22
|
end
|
@@ -32,7 +27,7 @@ describe Hamster::List do
|
|
32
27
|
@list = Hamster.list("A", "B", "C")
|
33
28
|
end
|
34
29
|
|
35
|
-
it "an array" do
|
30
|
+
it "an array with the same contents" do
|
36
31
|
@list.send(method, ["A", "B", "C"]).should == false
|
37
32
|
end
|
38
33
|
|
@@ -42,6 +37,10 @@ describe Hamster::List do
|
|
42
37
|
|
43
38
|
end
|
44
39
|
|
40
|
+
it "returns false when comparing an empty list with an empty array" do
|
41
|
+
Hamster.list.send(method, []).should == false
|
42
|
+
end
|
43
|
+
|
45
44
|
[
|
46
45
|
[[], [], true],
|
47
46
|
[[], [nil], false],
|