hamster 0.2.9 → 0.2.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.
- data/History.rdoc +18 -0
- data/lib/hamster/hash.rb +6 -2
- data/lib/hamster/list.rb +13 -50
- data/lib/hamster/set.rb +30 -6
- data/lib/hamster/stack.rb +4 -0
- data/lib/hamster/trie.rb +4 -2
- data/lib/hamster/undefined.rb +11 -0
- data/lib/hamster/version.rb +1 -1
- data/spec/hamster/hash/find_spec.rb +1 -1
- data/spec/hamster/hash/keys_spec.rb +21 -0
- data/spec/hamster/list/minimum_spec.rb +1 -1
- data/spec/hamster/list/reduce_spec.rb +2 -2
- data/spec/hamster/list/span_spec.rb +18 -17
- data/spec/hamster/list/to_a_spec.rb +0 -5
- data/spec/hamster/list/to_ary_spec.rb +5 -0
- data/spec/hamster/list/to_set_spec.rb +33 -0
- data/spec/hamster/set/maximum_spec.rb +2 -6
- data/spec/hamster/set/minimum_spec.rb +2 -6
- data/spec/hamster/set/one_spec.rb +7 -21
- data/spec/hamster/set/reduce_spec.rb +50 -23
- data/spec/hamster/stack/to_ary.rb +44 -0
- data/spec/hamster/tuple/to_a_spec.rb +0 -5
- data/spec/hamster/tuple/to_ary_spec.rb +5 -0
- data/spec/hamster/undefined/erase_spec.rb +47 -0
- metadata +7 -2
data/History.rdoc
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 0.2.11 / 2010-02-15
|
2
|
+
|
3
|
+
* Implement Set#one?
|
4
|
+
|
5
|
+
* Implement Set#minimum (aliased as #min).
|
6
|
+
|
7
|
+
* Implement Set#maximum (aliased as #max).
|
8
|
+
|
9
|
+
* Implement Set#reduce with an optional memo.
|
10
|
+
|
11
|
+
* Fix List#reduce should return nil when given no block and no starting value.
|
12
|
+
|
13
|
+
=== 0.2.10 / 2010-02-15
|
14
|
+
|
15
|
+
* Fix a bunch of spec failures under 1.8.7.
|
16
|
+
|
17
|
+
* Remove some redundant object construction.
|
18
|
+
|
1
19
|
=== 0.2.9 / 2010-02-11
|
2
20
|
|
3
21
|
* Fix #to_list not available in all Enumerables.
|
data/lib/hamster/hash.rb
CHANGED
@@ -12,7 +12,7 @@ module Hamster
|
|
12
12
|
|
13
13
|
extend Forwardable
|
14
14
|
|
15
|
-
def initialize(trie =
|
15
|
+
def initialize(trie = EmptyTrie)
|
16
16
|
@trie = trie
|
17
17
|
end
|
18
18
|
|
@@ -61,7 +61,7 @@ module Hamster
|
|
61
61
|
def map
|
62
62
|
return self unless block_given?
|
63
63
|
return self if empty?
|
64
|
-
self.class.new(@trie.reduce(
|
64
|
+
self.class.new(@trie.reduce(EmptyTrie) { |trie, entry| trie.put(*yield(entry.key, entry.value)) })
|
65
65
|
end
|
66
66
|
def_delegator :self, :map, :collect
|
67
67
|
|
@@ -119,6 +119,10 @@ module Hamster
|
|
119
119
|
end
|
120
120
|
def_delegator :self, :find, :detect
|
121
121
|
|
122
|
+
def keys
|
123
|
+
reduce(Hamster.set) { |keys, key, value| keys.add(key) }
|
124
|
+
end
|
125
|
+
|
122
126
|
def eql?(other)
|
123
127
|
other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
|
124
128
|
end
|
data/lib/hamster/list.rb
CHANGED
@@ -2,6 +2,7 @@ require 'forwardable'
|
|
2
2
|
require 'thread'
|
3
3
|
|
4
4
|
require 'hamster/core_ext/enumerable'
|
5
|
+
require 'hamster/undefined'
|
5
6
|
require 'hamster/tuple'
|
6
7
|
require 'hamster/sorter'
|
7
8
|
require 'hamster/hash'
|
@@ -53,8 +54,6 @@ module Hamster
|
|
53
54
|
|
54
55
|
extend Forwardable
|
55
56
|
|
56
|
-
Undefined = Object.new
|
57
|
-
|
58
57
|
CADR = /^c([ad]+)r$/
|
59
58
|
|
60
59
|
def_delegator :self, :head, :first
|
@@ -72,9 +71,6 @@ module Hamster
|
|
72
71
|
def_delegator :self, :cons, :>>
|
73
72
|
|
74
73
|
def each
|
75
|
-
# return nil if empty?
|
76
|
-
# yield(head)
|
77
|
-
# tail.each(&block)
|
78
74
|
return self unless block_given?
|
79
75
|
list = self
|
80
76
|
while !list.empty?
|
@@ -94,13 +90,10 @@ module Hamster
|
|
94
90
|
def_delegator :self, :map, :collect
|
95
91
|
|
96
92
|
def reduce(memo = Undefined, &block)
|
97
|
-
|
98
|
-
|
99
|
-
# return tail.reduce(head, &block) if memo.equal?(Undefined)
|
100
|
-
# tail.reduce(yield(memo, head), &block)
|
93
|
+
return Undefined.erase(memo) if empty?
|
94
|
+
return Undefined.erase(memo) unless block_given?
|
101
95
|
return tail.reduce(head, &block) if memo.equal?(Undefined)
|
102
|
-
|
103
|
-
each { |item| memo = yield(memo, item) }
|
96
|
+
each { |item| memo = yield(memo, item) }
|
104
97
|
memo
|
105
98
|
end
|
106
99
|
def_delegator :self, :reduce, :inject
|
@@ -135,10 +128,6 @@ module Hamster
|
|
135
128
|
end
|
136
129
|
|
137
130
|
def drop_while(&block)
|
138
|
-
# return self unless block_given?
|
139
|
-
# return self if empty?
|
140
|
-
# return self unless yield(head)
|
141
|
-
# tail.drop_while(&block)
|
142
131
|
return self unless block_given?
|
143
132
|
Stream.new do
|
144
133
|
list = self
|
@@ -158,10 +147,6 @@ module Hamster
|
|
158
147
|
end
|
159
148
|
|
160
149
|
def drop(number)
|
161
|
-
# return self unless block_given?
|
162
|
-
# return self if empty?
|
163
|
-
# return self unless number > 0
|
164
|
-
# tail.drop(number - 1)
|
165
150
|
Stream.new do
|
166
151
|
list = self
|
167
152
|
while !list.empty? && number > 0
|
@@ -180,9 +165,6 @@ module Hamster
|
|
180
165
|
def_delegator :self, :include?, :elem?
|
181
166
|
|
182
167
|
def any?
|
183
|
-
# return false if empty?
|
184
|
-
# return any? { |item| item } unless block_given?
|
185
|
-
# !! yield(head) || tail.any?(&block)
|
186
168
|
return any? { |item| item } unless block_given?
|
187
169
|
each { |item| return true if yield(item) }
|
188
170
|
false
|
@@ -191,9 +173,6 @@ module Hamster
|
|
191
173
|
def_delegator :self, :any?, :exists?
|
192
174
|
|
193
175
|
def all?
|
194
|
-
# return true if empty?
|
195
|
-
# return all? { |item| item } unless block_given?
|
196
|
-
# !! yield(head) && tail.all?(&block)
|
197
176
|
return all? { |item| item } unless block_given?
|
198
177
|
each { |item| return false unless yield(item) }
|
199
178
|
true
|
@@ -201,18 +180,12 @@ module Hamster
|
|
201
180
|
def_delegator :self, :all?, :forall?
|
202
181
|
|
203
182
|
def none?
|
204
|
-
# return true if empty?
|
205
|
-
# return none? { |item| item } unless block_given?
|
206
|
-
# !yield(head) && tail.none?(&block)
|
207
183
|
return none? { |item| item } unless block_given?
|
208
184
|
each { |item| return false if yield(item) }
|
209
185
|
true
|
210
186
|
end
|
211
187
|
|
212
188
|
def one?(&block)
|
213
|
-
# return true if empty?
|
214
|
-
# return one? { |item| item } unless block_given?
|
215
|
-
# !yield(head) && tail.none?(&block)
|
216
189
|
return one? { |item| item } unless block_given?
|
217
190
|
list = self
|
218
191
|
while !list.empty?
|
@@ -223,10 +196,6 @@ module Hamster
|
|
223
196
|
end
|
224
197
|
|
225
198
|
def find
|
226
|
-
# return nil if empty?
|
227
|
-
# return nil unless block_given?
|
228
|
-
# return head if yield(head)
|
229
|
-
# tail.find(&block)
|
230
199
|
return nil unless block_given?
|
231
200
|
each { |item| return item if yield(item) }
|
232
201
|
end
|
@@ -325,7 +294,7 @@ module Hamster
|
|
325
294
|
end
|
326
295
|
end
|
327
296
|
|
328
|
-
def uniq(items =
|
297
|
+
def uniq(items = EmptySet)
|
329
298
|
Stream.new do
|
330
299
|
next self if empty?
|
331
300
|
next tail.uniq(items) if items.include?(head)
|
@@ -428,11 +397,6 @@ module Hamster
|
|
428
397
|
def_delegator :self, :slice, :[]
|
429
398
|
|
430
399
|
def find_index
|
431
|
-
# def find_index(i = 0, &block)
|
432
|
-
# return nil if empty?
|
433
|
-
# return nil unless block_given?
|
434
|
-
# return i if yield(head)
|
435
|
-
# tail.find_index(i + 1, &block)
|
436
400
|
return nil unless block_given?
|
437
401
|
i = 0
|
438
402
|
list = self
|
@@ -472,11 +436,6 @@ module Hamster
|
|
472
436
|
end
|
473
437
|
|
474
438
|
def eql?(other)
|
475
|
-
# return true if other.equal?(self)
|
476
|
-
# return false unless other.is_a?(List)
|
477
|
-
# return other.empty? if empty?
|
478
|
-
# return false if other.empty?
|
479
|
-
# other.head.eql?(head) && other.tail.eql?(tail)
|
480
439
|
list = self
|
481
440
|
loop do
|
482
441
|
return true if other.equal?(list)
|
@@ -505,6 +464,10 @@ module Hamster
|
|
505
464
|
self
|
506
465
|
end
|
507
466
|
|
467
|
+
def to_set
|
468
|
+
reduce(EmptySet) { |set, item| set.add(item) }
|
469
|
+
end
|
470
|
+
|
508
471
|
def inspect
|
509
472
|
to_a.inspect
|
510
473
|
end
|
@@ -582,15 +545,15 @@ module Hamster
|
|
582
545
|
protected
|
583
546
|
|
584
547
|
def target
|
585
|
-
#
|
586
|
-
list =
|
548
|
+
# vivify
|
549
|
+
list = vivify
|
587
550
|
while list.is_a?(Stream)
|
588
|
-
list = list.
|
551
|
+
list = list.vivify
|
589
552
|
end
|
590
553
|
list
|
591
554
|
end
|
592
555
|
|
593
|
-
def
|
556
|
+
def vivify
|
594
557
|
@lock.synchronize do
|
595
558
|
unless @block.nil?
|
596
559
|
@target = @block.call
|
data/lib/hamster/set.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
|
+
require 'hamster/undefined'
|
3
4
|
require 'hamster/tuple'
|
4
5
|
require 'hamster/sorter'
|
5
6
|
require 'hamster/trie'
|
@@ -15,7 +16,7 @@ module Hamster
|
|
15
16
|
|
16
17
|
extend Forwardable
|
17
18
|
|
18
|
-
def initialize(trie =
|
19
|
+
def initialize(trie = EmptyTrie)
|
19
20
|
@trie = trie
|
20
21
|
end
|
21
22
|
|
@@ -57,13 +58,16 @@ module Hamster
|
|
57
58
|
def map
|
58
59
|
return self unless block_given?
|
59
60
|
return self if empty?
|
60
|
-
self.class.new(@trie.reduce(
|
61
|
+
self.class.new(@trie.reduce(EmptyTrie) { |trie, entry| trie.put(yield(entry.key), nil) })
|
61
62
|
end
|
62
63
|
def_delegator :self, :map, :collect
|
63
64
|
|
64
|
-
def reduce(memo)
|
65
|
-
|
66
|
-
|
65
|
+
def reduce(memo = Undefined)
|
66
|
+
memo = @trie.reduce(memo) do |memo, entry|
|
67
|
+
next entry.key if memo.equal?(Undefined)
|
68
|
+
yield(memo, entry.key)
|
69
|
+
end if block_given?
|
70
|
+
Undefined.erase(memo)
|
67
71
|
end
|
68
72
|
def_delegator :self, :reduce, :inject
|
69
73
|
def_delegator :self, :reduce, :fold
|
@@ -108,7 +112,15 @@ module Hamster
|
|
108
112
|
end
|
109
113
|
|
110
114
|
def one?
|
111
|
-
return one? { |item| item } unless block_given?
|
115
|
+
return one? { |item| !! item } unless block_given?
|
116
|
+
@trie.reduce(false) do |previously_matched, entry|
|
117
|
+
if yield(entry.key)
|
118
|
+
return false if previously_matched
|
119
|
+
true
|
120
|
+
else
|
121
|
+
previously_matched
|
122
|
+
end
|
123
|
+
end
|
112
124
|
end
|
113
125
|
|
114
126
|
def find
|
@@ -123,6 +135,18 @@ module Hamster
|
|
123
135
|
Tuple.new(filter(&block), reject(&block))
|
124
136
|
end
|
125
137
|
|
138
|
+
def minimum(&block)
|
139
|
+
return minimum { |minimum, item| item <=> minimum } unless block_given?
|
140
|
+
reduce { |minimum, item| yield(minimum, item) < 0 ? item : minimum }
|
141
|
+
end
|
142
|
+
def_delegator :self, :minimum, :min
|
143
|
+
|
144
|
+
def maximum(&block)
|
145
|
+
return maximum { |maximum, item| item <=> maximum } unless block_given?
|
146
|
+
reduce { |maximum, item| yield(maximum, item) > 0 ? item : maximum }
|
147
|
+
end
|
148
|
+
def_delegator :self, :maximum, :max
|
149
|
+
|
126
150
|
def grep(pattern, &block)
|
127
151
|
filter { |item| pattern === item }.map(&block)
|
128
152
|
end
|
data/lib/hamster/stack.rb
CHANGED
data/lib/hamster/trie.rb
CHANGED
@@ -6,7 +6,7 @@ module Hamster
|
|
6
6
|
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
def initialize(significant_bits
|
9
|
+
def initialize(significant_bits, entries = [], children = [])
|
10
10
|
@significant_bits = significant_bits
|
11
11
|
@entries = entries
|
12
12
|
@children = children
|
@@ -81,7 +81,7 @@ module Hamster
|
|
81
81
|
|
82
82
|
# Returns a copy of <tt>self</tt> with the given key (and associated value) deleted. If not found, returns <tt>self</tt>.
|
83
83
|
def delete(key)
|
84
|
-
find_and_delete(key) ||
|
84
|
+
find_and_delete(key) || self.class.new(@significant_bits)
|
85
85
|
end
|
86
86
|
|
87
87
|
def include?(key, value)
|
@@ -167,4 +167,6 @@ module Hamster
|
|
167
167
|
|
168
168
|
end
|
169
169
|
|
170
|
+
EmptyTrie = Trie.new(0)
|
171
|
+
|
170
172
|
end
|
data/lib/hamster/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/hash'
|
4
|
+
require 'hamster/set'
|
5
|
+
|
6
|
+
describe Hamster::Hash do
|
7
|
+
|
8
|
+
describe "#keys" do
|
9
|
+
|
10
|
+
before do
|
11
|
+
hash = Hamster.hash("A" => "aye", "B" => "bee", "C" => "see")
|
12
|
+
@result = hash.keys
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns the keys as a set" do
|
16
|
+
@result.should == Hamster.set("A", "B", "C")
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -32,7 +32,7 @@ describe Hamster::List do
|
|
32
32
|
|
33
33
|
before do
|
34
34
|
original = Hamster.list(*values)
|
35
|
-
@result = original.send(method) { |
|
35
|
+
@result = original.send(method) { |minimum, item| item.length <=> minimum.length }
|
36
36
|
end
|
37
37
|
|
38
38
|
it "returns #{expected.inspect}" do
|
@@ -1,15 +1,20 @@
|
|
1
1
|
require File.expand_path('../../../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
require 'hamster/tuple'
|
4
3
|
require 'hamster/list'
|
5
4
|
|
6
|
-
describe Hamster
|
5
|
+
describe "Hamster.list#span" do
|
7
6
|
|
8
|
-
|
7
|
+
it "is lazy" do
|
8
|
+
lambda { Hamster.stream { |item| fail }.span { true } }.should_not raise_error
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
describe <<-DESC do
|
12
|
+
given a predicate (in the form of a block), splits the list into two lists
|
13
|
+
(returned as a tuple) such that elements in the first list (the prefix) are
|
14
|
+
taken from the head of the list while the predicate is satisfied, and elements
|
15
|
+
in the second list (the remainder) are the remaining elements from the list
|
16
|
+
once the predicate is not satisfied. For example:
|
17
|
+
DESC
|
13
18
|
|
14
19
|
[
|
15
20
|
[[], [], []],
|
@@ -22,13 +27,13 @@ describe Hamster::List do
|
|
22
27
|
[[4], [], [4]],
|
23
28
|
].each do |values, expected_prefix, expected_remainder|
|
24
29
|
|
25
|
-
describe "
|
30
|
+
describe "given the list #{values.inspect}" do
|
26
31
|
|
27
32
|
before do
|
28
33
|
@original = Hamster.list(*values)
|
29
34
|
end
|
30
35
|
|
31
|
-
describe "
|
36
|
+
describe "and a predicate that returns true for values <= 2" do
|
32
37
|
|
33
38
|
before do
|
34
39
|
@result = @original.span { |item| item <= 2 }
|
@@ -40,21 +45,17 @@ describe Hamster::List do
|
|
40
45
|
@original.should == Hamster.list(*values)
|
41
46
|
end
|
42
47
|
|
43
|
-
it "returns
|
44
|
-
@result.is_a?(Hamster::Tuple).should == true
|
45
|
-
end
|
46
|
-
|
47
|
-
it "correctly identifies the prefix" do
|
48
|
+
it "returns the prefix as #{expected_prefix.inspect}" do
|
48
49
|
@prefix.should == Hamster.list(*expected_prefix)
|
49
50
|
end
|
50
51
|
|
51
|
-
it "
|
52
|
+
it "returns the remainder as #{expected_remainder.inspect}" do
|
52
53
|
@remainder.should == Hamster.list(*expected_remainder)
|
53
54
|
end
|
54
55
|
|
55
56
|
end
|
56
57
|
|
57
|
-
describe "without a
|
58
|
+
describe "without a predicate" do
|
58
59
|
|
59
60
|
before do
|
60
61
|
@result = @original.span
|
@@ -62,7 +63,7 @@ describe Hamster::List do
|
|
62
63
|
@remainder = @result.last
|
63
64
|
end
|
64
65
|
|
65
|
-
it "returns a tuple
|
66
|
+
it "returns a tuple" do
|
66
67
|
@result.is_a?(Hamster::Tuple).should == true
|
67
68
|
end
|
68
69
|
|
@@ -70,7 +71,7 @@ describe Hamster::List do
|
|
70
71
|
@prefix.should equal(@original)
|
71
72
|
end
|
72
73
|
|
73
|
-
it "
|
74
|
+
it "returns an empty list as the remainder" do
|
74
75
|
@remainder.should be_empty
|
75
76
|
end
|
76
77
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/list'
|
4
|
+
require 'hamster/set'
|
5
|
+
|
6
|
+
describe Hamster::List do
|
7
|
+
|
8
|
+
describe "#to_set" do
|
9
|
+
|
10
|
+
[
|
11
|
+
[],
|
12
|
+
["A"],
|
13
|
+
["A", "B", "C"],
|
14
|
+
].each do |values|
|
15
|
+
|
16
|
+
describe "on #{values.inspect}" do
|
17
|
+
|
18
|
+
before do
|
19
|
+
original = Hamster.list(*values)
|
20
|
+
@result = original.to_set
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns self" do
|
24
|
+
@result.should == Hamster.set(*values)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -20,9 +20,7 @@ describe Hamster::Set do
|
|
20
20
|
|
21
21
|
before do
|
22
22
|
original = Hamster.set(*values)
|
23
|
-
|
24
|
-
@result = original.send(method) { |maximum, item| item.length <=> maximum.length }
|
25
|
-
end
|
23
|
+
@result = original.send(method) { |maximum, item| item.length <=> maximum.length }
|
26
24
|
end
|
27
25
|
|
28
26
|
it "returns #{expected.inspect}" do
|
@@ -47,9 +45,7 @@ describe Hamster::Set do
|
|
47
45
|
|
48
46
|
before do
|
49
47
|
original = Hamster.set(*values)
|
50
|
-
|
51
|
-
@result = original.send(method)
|
52
|
-
end
|
48
|
+
@result = original.send(method)
|
53
49
|
end
|
54
50
|
|
55
51
|
it "returns #{expected.inspect}" do
|
@@ -20,9 +20,7 @@ describe Hamster::Set do
|
|
20
20
|
|
21
21
|
before do
|
22
22
|
original = Hamster.set(*values)
|
23
|
-
|
24
|
-
@result = original.send(method) { |maximum, item| item.length <=> maximum.length }
|
25
|
-
end
|
23
|
+
@result = original.send(method) { |minimum, item| item.length <=> minimum.length }
|
26
24
|
end
|
27
25
|
|
28
26
|
it "returns #{expected.inspect}" do
|
@@ -47,9 +45,7 @@ describe Hamster::Set do
|
|
47
45
|
|
48
46
|
before do
|
49
47
|
original = Hamster.set(*values)
|
50
|
-
|
51
|
-
@result = original.send(method)
|
52
|
-
end
|
48
|
+
@result = original.send(method)
|
53
49
|
end
|
54
50
|
|
55
51
|
it "returns #{expected.inspect}" do
|
@@ -13,15 +13,11 @@ describe Hamster::Set do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "with a block returns false" do
|
16
|
-
|
17
|
-
@set.one? {}.should == false
|
18
|
-
end
|
16
|
+
@set.one? {}.should == false
|
19
17
|
end
|
20
18
|
|
21
19
|
it "with no block returns false" do
|
22
|
-
|
23
|
-
@set.one?.should == false
|
24
|
-
end
|
20
|
+
@set.one?.should == false
|
25
21
|
end
|
26
22
|
|
27
23
|
end
|
@@ -35,21 +31,15 @@ describe Hamster::Set do
|
|
35
31
|
end
|
36
32
|
|
37
33
|
it "returns false if the block returns true more than once" do
|
38
|
-
|
39
|
-
@set.one? { |item| true }.should == false
|
40
|
-
end
|
34
|
+
@set.one? { |item| true }.should == false
|
41
35
|
end
|
42
36
|
|
43
37
|
it "returns false if the block never returns true" do
|
44
|
-
|
45
|
-
@set.one? { |item| false }.should == false
|
46
|
-
end
|
38
|
+
@set.one? { |item| false }.should == false
|
47
39
|
end
|
48
40
|
|
49
41
|
it "returns true if the block only returns true once" do
|
50
|
-
|
51
|
-
@set.one? { |item| item == "A" }.should == true
|
52
|
-
end
|
42
|
+
@set.one? { |item| item == "A" }.should == true
|
53
43
|
end
|
54
44
|
|
55
45
|
end
|
@@ -57,15 +47,11 @@ describe Hamster::Set do
|
|
57
47
|
describe "with no block" do
|
58
48
|
|
59
49
|
it "returns false if more than one value is truthy" do
|
60
|
-
|
61
|
-
Hamster.set(nil, true, "A").one?.should == false
|
62
|
-
end
|
50
|
+
Hamster.set(nil, true, "A").one?.should == false
|
63
51
|
end
|
64
52
|
|
65
53
|
it "returns true if only one value is truthy" do
|
66
|
-
|
67
|
-
Hamster.set(nil, true, false).one?.should == true
|
68
|
-
end
|
54
|
+
Hamster.set(nil, true, false).one?.should == true
|
69
55
|
end
|
70
56
|
|
71
57
|
end
|
@@ -8,45 +8,72 @@ describe Hamster::Set do
|
|
8
8
|
|
9
9
|
describe "##{method}" do
|
10
10
|
|
11
|
-
|
11
|
+
[
|
12
|
+
[[], 10, 10],
|
13
|
+
[[1], 10, 9],
|
14
|
+
[[1, 2, 3], 10, 4],
|
15
|
+
].each do |values, initial, expected|
|
12
16
|
|
13
|
-
|
14
|
-
@original = Hamster.set
|
15
|
-
@result = @original.send(method, "ABC") {}
|
16
|
-
end
|
17
|
+
describe "on #{values.inspect}" do
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
before do
|
20
|
+
@set = Hamster.set(*values)
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
+
describe "with an initial value of #{initial}" do
|
23
24
|
|
24
|
-
|
25
|
+
describe "and a block" do
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
it "returns #{expected.inspect}" do
|
28
|
+
@set.send(method, initial) { |memo, item| memo - item }.should == expected
|
29
|
+
end
|
29
30
|
|
30
|
-
|
31
|
+
end
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
describe "and no block" do
|
34
|
+
|
35
|
+
it "returns the memo" do
|
36
|
+
@set.send(method, initial).should == initial
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
35
40
|
|
36
|
-
it "returns the final memo" do
|
37
|
-
@result.should == 3
|
38
41
|
end
|
39
42
|
|
40
43
|
end
|
41
44
|
|
42
|
-
|
45
|
+
end
|
46
|
+
|
47
|
+
[
|
48
|
+
[[], nil],
|
49
|
+
[[1], 1],
|
50
|
+
[[1, 2, 3], -4],
|
51
|
+
].each do |values, expected|
|
52
|
+
|
53
|
+
describe "on #{values.inspect}" do
|
43
54
|
|
44
55
|
before do
|
45
|
-
@
|
56
|
+
@set = Hamster.set(*values)
|
46
57
|
end
|
47
58
|
|
48
|
-
|
49
|
-
|
59
|
+
describe "with no initial value" do
|
60
|
+
|
61
|
+
describe "and a block" do
|
62
|
+
|
63
|
+
it "returns #{expected.inspect}" do
|
64
|
+
@set.send(method) { |memo, item| memo - item }.should == expected
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "and no block" do
|
70
|
+
|
71
|
+
it "returns nil" do
|
72
|
+
@set.send(method).should be_nil
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
50
77
|
end
|
51
78
|
|
52
79
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/stack'
|
4
|
+
|
5
|
+
describe Hamster::Stack do
|
6
|
+
|
7
|
+
describe "#to_ary" do
|
8
|
+
|
9
|
+
describe "enables implicit conversion to" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@stack = Hamster.stack("D", "C", "B", "A")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "block parameters" do
|
16
|
+
def func(&block)
|
17
|
+
yield(@stack)
|
18
|
+
end
|
19
|
+
func do |a, b, *c|
|
20
|
+
a.should == "A"
|
21
|
+
b.should == "B"
|
22
|
+
c.should == ["C", "D"]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "method arguments" do
|
27
|
+
def func(a, b, *c)
|
28
|
+
a.should == "A"
|
29
|
+
b.should == "B"
|
30
|
+
c.should == ["C", "D"]
|
31
|
+
end
|
32
|
+
func(*@stack)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "works with splat" do
|
36
|
+
array = *@stack
|
37
|
+
array.should == ["A", "B", "C", "D"]
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.expand_path('../../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
require 'hamster/undefined'
|
4
|
+
|
5
|
+
describe Hamster::Undefined do
|
6
|
+
|
7
|
+
describe "#erase" do
|
8
|
+
|
9
|
+
describe "with Undefined" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@result = Hamster::Undefined.erase(Hamster::Undefined)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns nil" do
|
16
|
+
@result.should be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "with nil" do
|
22
|
+
|
23
|
+
before do
|
24
|
+
@result = Hamster::Undefined.erase(nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns nil" do
|
28
|
+
@result.should be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "otherwise" do
|
34
|
+
|
35
|
+
before do
|
36
|
+
@result = Hamster::Undefined.erase("Hello")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns the value unchanged" do
|
40
|
+
@result.should == "Hello"
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hamster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Harris
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-15 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/hamster/stack.rb
|
54
54
|
- lib/hamster/trie.rb
|
55
55
|
- lib/hamster/tuple.rb
|
56
|
+
- lib/hamster/undefined.rb
|
56
57
|
- lib/hamster/version.rb
|
57
58
|
- lib/hamster.rb
|
58
59
|
- spec/hamster/core_ext/array_spec.rb
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- spec/hamster/hash/get_spec.rb
|
73
74
|
- spec/hamster/hash/has_key_spec.rb
|
74
75
|
- spec/hamster/hash/inspect_spec.rb
|
76
|
+
- spec/hamster/hash/keys_spec.rb
|
75
77
|
- spec/hamster/hash/map_spec.rb
|
76
78
|
- spec/hamster/hash/none_spec.rb
|
77
79
|
- spec/hamster/hash/put_spec.rb
|
@@ -140,6 +142,7 @@ files:
|
|
140
142
|
- spec/hamster/list/to_a_spec.rb
|
141
143
|
- spec/hamster/list/to_ary_spec.rb
|
142
144
|
- spec/hamster/list/to_list_spec.rb
|
145
|
+
- spec/hamster/list/to_set_spec.rb
|
143
146
|
- spec/hamster/list/union_spec.rb
|
144
147
|
- spec/hamster/list/uniq_spec.rb
|
145
148
|
- spec/hamster/list/zip_spec.rb
|
@@ -195,6 +198,7 @@ files:
|
|
195
198
|
- spec/hamster/stack/push_spec.rb
|
196
199
|
- spec/hamster/stack/size_spec.rb
|
197
200
|
- spec/hamster/stack/to_a_spec.rb
|
201
|
+
- spec/hamster/stack/to_ary.rb
|
198
202
|
- spec/hamster/stack/to_list_spec.rb
|
199
203
|
- spec/hamster/stack/top_spec.rb
|
200
204
|
- spec/hamster/trie/remove_spec.rb
|
@@ -205,6 +209,7 @@ files:
|
|
205
209
|
- spec/hamster/tuple/last_spec.rb
|
206
210
|
- spec/hamster/tuple/to_a_spec.rb
|
207
211
|
- spec/hamster/tuple/to_ary_spec.rb
|
212
|
+
- spec/hamster/undefined/erase_spec.rb
|
208
213
|
- spec/spec.opts
|
209
214
|
- spec/spec_helper.rb
|
210
215
|
- tasks/spec.rb
|