hamster 0.1.23 → 0.2.0
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.
- 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
data/lib/hamster/set.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
require 'hamster/trie'
|
2
4
|
require 'hamster/list'
|
3
5
|
|
@@ -9,6 +11,8 @@ module Hamster
|
|
9
11
|
|
10
12
|
class Set
|
11
13
|
|
14
|
+
extend Forwardable
|
15
|
+
|
12
16
|
def initialize(trie = Trie.new)
|
13
17
|
@trie = trie
|
14
18
|
end
|
@@ -16,19 +20,19 @@ module Hamster
|
|
16
20
|
def empty?
|
17
21
|
@trie.empty?
|
18
22
|
end
|
19
|
-
|
23
|
+
def_delegator :self, :empty?, :null?
|
20
24
|
|
21
25
|
def size
|
22
26
|
@trie.size
|
23
27
|
end
|
24
|
-
|
28
|
+
def_delegator :self, :size, :length
|
25
29
|
|
26
30
|
def include?(item)
|
27
31
|
@trie.has_key?(item)
|
28
32
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
def_delegator :self, :include?, :member?
|
34
|
+
def_delegator :self, :include?, :contains?
|
35
|
+
def_delegator :self, :include?, :elem?
|
32
36
|
|
33
37
|
def add(item)
|
34
38
|
if include?(item)
|
@@ -37,7 +41,7 @@ module Hamster
|
|
37
41
|
self.class.new(@trie.put(item, nil))
|
38
42
|
end
|
39
43
|
end
|
40
|
-
|
44
|
+
def_delegator :self, :add, :<<
|
41
45
|
|
42
46
|
def delete(key)
|
43
47
|
trie = @trie.delete(key)
|
@@ -52,7 +56,7 @@ module Hamster
|
|
52
56
|
return self unless block_given?
|
53
57
|
@trie.each { |entry| yield(entry.key) }
|
54
58
|
end
|
55
|
-
|
59
|
+
def_delegator :self, :each, :foreach
|
56
60
|
|
57
61
|
def map
|
58
62
|
return self unless block_given?
|
@@ -62,14 +66,14 @@ module Hamster
|
|
62
66
|
self.class.new(@trie.reduce(Trie.new) { |trie, entry| trie.put(yield(entry.key), nil) })
|
63
67
|
end
|
64
68
|
end
|
65
|
-
|
69
|
+
def_delegator :self, :map, :collect
|
66
70
|
|
67
71
|
def reduce(memo)
|
68
72
|
return memo unless block_given?
|
69
73
|
@trie.reduce(memo) { |memo, entry| yield(memo, entry.key) }
|
70
74
|
end
|
71
|
-
|
72
|
-
|
75
|
+
def_delegator :self, :reduce, :inject
|
76
|
+
def_delegator :self, :reduce, :fold
|
73
77
|
|
74
78
|
def filter
|
75
79
|
return self unless block_given?
|
@@ -80,29 +84,30 @@ module Hamster
|
|
80
84
|
self.class.new(trie)
|
81
85
|
end
|
82
86
|
end
|
83
|
-
|
84
|
-
|
87
|
+
def_delegator :self, :filter, :select
|
88
|
+
def_delegator :self, :filter, :find_all
|
85
89
|
|
86
90
|
def remove
|
87
91
|
return self unless block_given?
|
88
92
|
filter { |item| !yield(item) }
|
89
93
|
end
|
90
|
-
|
91
|
-
|
94
|
+
def_delegator :self, :remove, :reject
|
95
|
+
def_delegator :self, :remove, :delete_if
|
92
96
|
|
93
97
|
def any?
|
94
98
|
return any? { |item| item } unless block_given?
|
95
99
|
each { |item| return true if yield(item) }
|
96
100
|
false
|
97
101
|
end
|
98
|
-
|
99
|
-
|
102
|
+
def_delegator :self, :any?, :exist?
|
103
|
+
def_delegator :self, :any?, :exists?
|
100
104
|
|
101
105
|
def all?
|
102
106
|
return all? { |item| item } unless block_given?
|
103
107
|
each { |item| return false unless yield(item) }
|
104
108
|
true
|
105
109
|
end
|
110
|
+
def_delegator :self, :all?, :forall?
|
106
111
|
|
107
112
|
def none?
|
108
113
|
return none? { |item| item } unless block_given?
|
@@ -115,11 +120,11 @@ module Hamster
|
|
115
120
|
each { |item| return item if yield(item) }
|
116
121
|
nil
|
117
122
|
end
|
118
|
-
|
123
|
+
def_delegator :self, :find, :detect
|
119
124
|
|
120
125
|
def partition(&block)
|
121
126
|
return self unless block_given?
|
122
|
-
Stream.new(filter(&block)
|
127
|
+
Stream.new { Sequence.new(filter(&block), Sequence.new(reject(&block))) }
|
123
128
|
end
|
124
129
|
|
125
130
|
def grep(pattern, &block)
|
@@ -133,7 +138,15 @@ module Hamster
|
|
133
138
|
def head
|
134
139
|
find { true }
|
135
140
|
end
|
136
|
-
|
141
|
+
def_delegator :self, :head, :first
|
142
|
+
|
143
|
+
def product
|
144
|
+
reduce(1, &:*)
|
145
|
+
end
|
146
|
+
|
147
|
+
def sum
|
148
|
+
reduce(0, &:+)
|
149
|
+
end
|
137
150
|
|
138
151
|
def sort(&block)
|
139
152
|
to_list.sort(&block)
|
@@ -150,20 +163,21 @@ module Hamster
|
|
150
163
|
def eql?(other)
|
151
164
|
other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
|
152
165
|
end
|
153
|
-
|
166
|
+
def_delegator :self, :eql?, :==
|
154
167
|
|
155
168
|
def dup
|
156
169
|
self
|
157
170
|
end
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
171
|
+
def_delegator :self, :dup, :clone
|
172
|
+
def_delegator :self, :dup, :uniq
|
173
|
+
def_delegator :self, :dup, :nub
|
174
|
+
def_delegator :self, :dup, :to_set
|
175
|
+
def_delegator :self, :dup, :remove_duplicates
|
162
176
|
|
163
177
|
def to_a
|
164
178
|
reduce([]) { |a, item| a << item }
|
165
179
|
end
|
166
|
-
|
180
|
+
def_delegator :self, :to_a, :entries
|
167
181
|
|
168
182
|
def to_list
|
169
183
|
reduce(EmptyList) { |list, item| list.cons(item) }
|
data/lib/hamster/stack.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
require 'hamster/list'
|
2
4
|
|
3
5
|
module Hamster
|
@@ -8,6 +10,8 @@ module Hamster
|
|
8
10
|
|
9
11
|
class Stack
|
10
12
|
|
13
|
+
extend Forwardable
|
14
|
+
|
11
15
|
def initialize(list)
|
12
16
|
@list = list
|
13
17
|
end
|
@@ -19,7 +23,7 @@ module Hamster
|
|
19
23
|
def size
|
20
24
|
@list.size
|
21
25
|
end
|
22
|
-
|
26
|
+
def_delegator :self, :size, :length
|
23
27
|
|
24
28
|
def top
|
25
29
|
@list.head
|
@@ -28,7 +32,7 @@ module Hamster
|
|
28
32
|
def push(item)
|
29
33
|
self.class.new(@list.cons(item))
|
30
34
|
end
|
31
|
-
|
35
|
+
def_delegator :self, :push, :<<
|
32
36
|
|
33
37
|
def pop
|
34
38
|
list = @list.tail
|
@@ -48,17 +52,17 @@ module Hamster
|
|
48
52
|
return false unless other.class.equal?(self.class)
|
49
53
|
@list.eql?(other.instance_eval{@list})
|
50
54
|
end
|
51
|
-
|
55
|
+
def_delegator :self, :eql?, :==
|
52
56
|
|
53
57
|
def dup
|
54
58
|
self
|
55
59
|
end
|
56
|
-
|
60
|
+
def_delegator :self, :dup, :clone
|
57
61
|
|
58
62
|
def to_a
|
59
63
|
@list.to_a
|
60
64
|
end
|
61
|
-
|
65
|
+
def_delegator :self, :to_a, :entries
|
62
66
|
|
63
67
|
def to_list
|
64
68
|
@list
|
data/lib/hamster/trie.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
module Hamster
|
2
4
|
|
3
5
|
class Trie
|
4
6
|
|
7
|
+
extend Forwardable
|
8
|
+
|
5
9
|
def initialize(significant_bits = 0, entries = [], children = [])
|
6
10
|
@significant_bits = significant_bits
|
7
11
|
@entries = entries
|
@@ -94,7 +98,7 @@ module Hamster
|
|
94
98
|
end
|
95
99
|
true
|
96
100
|
end
|
97
|
-
|
101
|
+
def_delegator :self, :eql?, :==
|
98
102
|
|
99
103
|
protected
|
100
104
|
|
data/lib/hamster/version.rb
CHANGED
@@ -4,46 +4,50 @@ require 'hamster/hash'
|
|
4
4
|
|
5
5
|
describe Hamster::Hash do
|
6
6
|
|
7
|
-
|
7
|
+
[:all?, :forall?].each do |method|
|
8
8
|
|
9
|
-
describe "
|
9
|
+
describe "##{method}" do
|
10
10
|
|
11
|
-
|
12
|
-
@hash = Hamster.hash
|
13
|
-
end
|
14
|
-
|
15
|
-
it "with a block returns true" do
|
16
|
-
@hash.all? {}.should == true
|
17
|
-
end
|
11
|
+
describe "when empty" do
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
|
13
|
+
before do
|
14
|
+
@hash = Hamster.hash
|
15
|
+
end
|
22
16
|
|
23
|
-
|
17
|
+
it "with a block returns true" do
|
18
|
+
@hash.send(method) {}.should == true
|
19
|
+
end
|
24
20
|
|
25
|
-
|
21
|
+
it "with no block returns true" do
|
22
|
+
@hash.send(method).should == true
|
23
|
+
end
|
26
24
|
|
27
|
-
before do
|
28
|
-
@hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
|
29
25
|
end
|
30
26
|
|
31
|
-
describe "
|
27
|
+
describe "when not empty" do
|
32
28
|
|
33
|
-
|
34
|
-
@hash.
|
29
|
+
before do
|
30
|
+
@hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
|
35
31
|
end
|
36
32
|
|
37
|
-
|
38
|
-
|
33
|
+
describe "with a block" do
|
34
|
+
|
35
|
+
it "returns true if the block always returns true" do
|
36
|
+
@hash.send(method) { |key, value| true }.should == true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns false if the block ever returns false" do
|
40
|
+
@hash.send(method) { |key, value| key == "D" || value == "dee" }.should == false
|
41
|
+
end
|
42
|
+
|
39
43
|
end
|
40
44
|
|
41
|
-
|
45
|
+
describe "with no block" do
|
42
46
|
|
43
|
-
|
47
|
+
it "returns true" do
|
48
|
+
@hash.send(method).should == true
|
49
|
+
end
|
44
50
|
|
45
|
-
it "returns true" do
|
46
|
-
@hash.all?.should == true
|
47
51
|
end
|
48
52
|
|
49
53
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
require 'hamster/hash'
|
4
|
+
|
5
|
+
describe Hamster::Hash do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
|
9
|
+
end
|
10
|
+
|
11
|
+
[:uniq, :nub, :remove_duplicates].each do |method|
|
12
|
+
|
13
|
+
describe "##{method}" do
|
14
|
+
|
15
|
+
it "returns self" do
|
16
|
+
@hash.send(method).should equal(@hash)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -4,98 +4,98 @@ require 'hamster/list'
|
|
4
4
|
|
5
5
|
describe Hamster::List do
|
6
6
|
|
7
|
-
|
7
|
+
[:all?, :forall?].each do |method|
|
8
8
|
|
9
|
-
describe "
|
9
|
+
describe "##{method}" do
|
10
10
|
|
11
|
-
|
12
|
-
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
13
|
-
end
|
11
|
+
describe "on a really big list" do
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
before do
|
14
|
+
@list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "doesn't run out of stack" do
|
18
|
+
lambda { @list.send(method) }.should_not raise_error
|
19
|
+
end
|
18
20
|
|
19
|
-
after do
|
20
|
-
@list.all? { true }
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
describe "when empty" do
|
24
24
|
|
25
|
-
|
25
|
+
before do
|
26
|
+
@list = Hamster.list
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
it "with a block returns true" do
|
30
|
+
@list.send(method) {}.should == true
|
31
|
+
end
|
30
32
|
|
31
|
-
|
32
|
-
|
33
|
-
|
33
|
+
it "with no block returns true" do
|
34
|
+
@list.send(method).should == true
|
35
|
+
end
|
34
36
|
|
35
|
-
it "with no block returns true" do
|
36
|
-
@list.all?.should == true
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
describe "when not empty" do
|
40
40
|
|
41
|
-
|
41
|
+
describe "with a block" do
|
42
42
|
|
43
|
-
|
43
|
+
before do
|
44
|
+
@list = Hamster.list("A", "B", "C")
|
45
|
+
end
|
44
46
|
|
45
|
-
|
46
|
-
@list = Hamster.list("A", "B", "C")
|
47
|
-
end
|
47
|
+
describe "if the block always returns true" do
|
48
48
|
|
49
|
-
|
49
|
+
before do
|
50
|
+
@result = @list.send(method) { |item| true }
|
51
|
+
end
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
it "returns true" do
|
54
|
+
@result.should == true
|
55
|
+
end
|
54
56
|
|
55
|
-
it "returns true" do
|
56
|
-
@result.should == true
|
57
57
|
end
|
58
58
|
|
59
|
-
|
59
|
+
describe "if the block ever returns false" do
|
60
60
|
|
61
|
-
|
61
|
+
before do
|
62
|
+
@result = @list.send(method) { |item| item == "D" }
|
63
|
+
end
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
-
|
65
|
+
it "returns false" do
|
66
|
+
@result.should == false
|
67
|
+
end
|
66
68
|
|
67
|
-
it "returns false" do
|
68
|
-
@result.should == false
|
69
69
|
end
|
70
70
|
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
describe "with no block" do
|
74
74
|
|
75
|
-
|
75
|
+
describe "if all values are truthy" do
|
76
76
|
|
77
|
-
|
77
|
+
before do
|
78
|
+
@result = Hamster.list(true, "A").send(method)
|
79
|
+
end
|
78
80
|
|
79
|
-
|
80
|
-
|
81
|
-
|
81
|
+
it "returns true" do
|
82
|
+
@result.should == true
|
83
|
+
end
|
82
84
|
|
83
|
-
it "returns true" do
|
84
|
-
@result.should == true
|
85
85
|
end
|
86
86
|
|
87
|
-
|
87
|
+
[nil, false].each do |value|
|
88
88
|
|
89
|
-
|
89
|
+
describe "if any value is #{value.inspect}" do
|
90
90
|
|
91
|
-
|
91
|
+
before do
|
92
|
+
@result = Hamster.list(value, true, "A").send(method)
|
93
|
+
end
|
92
94
|
|
93
|
-
|
94
|
-
|
95
|
-
|
95
|
+
it "returns false" do
|
96
|
+
@result.should == false
|
97
|
+
end
|
96
98
|
|
97
|
-
it "returns false" do
|
98
|
-
@result.should == false
|
99
99
|
end
|
100
100
|
|
101
101
|
end
|