hamster 0.2.9 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.
@@ -12,7 +12,7 @@ module Hamster
12
12
 
13
13
  extend Forwardable
14
14
 
15
- def initialize(trie = Trie.new)
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(Trie.new) { |trie, entry| trie.put(*yield(entry.key, entry.value)) })
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
@@ -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
- # return memo if empty?
98
- # return memo unless block_given?
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
- return memo unless block_given?
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 = Set.new)
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
- # conjure
586
- list = conjure
548
+ # vivify
549
+ list = vivify
587
550
  while list.is_a?(Stream)
588
- list = list.conjure
551
+ list = list.vivify
589
552
  end
590
553
  list
591
554
  end
592
555
 
593
- def conjure
556
+ def vivify
594
557
  @lock.synchronize do
595
558
  unless @block.nil?
596
559
  @target = @block.call
@@ -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 = Trie.new)
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(Trie.new) { |trie, entry| trie.put(yield(entry.key), nil) })
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
- return memo unless block_given?
66
- @trie.reduce(memo) { |memo, entry| yield(memo, entry.key) }
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
@@ -64,6 +64,10 @@ module Hamster
64
64
  end
65
65
  def_delegator :self, :to_a, :entries
66
66
 
67
+ def to_ary
68
+ @list.to_ary
69
+ end
70
+
67
71
  def to_list
68
72
  @list
69
73
  end
@@ -6,7 +6,7 @@ module Hamster
6
6
 
7
7
  extend Forwardable
8
8
 
9
- def initialize(significant_bits = 0, entries = [], children = [])
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) || Trie.new(@significant_bits)
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
@@ -0,0 +1,11 @@
1
+ module Hamster
2
+
3
+ module Undefined
4
+
5
+ def self.erase(value)
6
+ value unless value.equal?(self)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.2.9".freeze
3
+ VERSION = "0.2.11".freeze
4
4
 
5
5
  end
@@ -30,7 +30,7 @@ describe Hamster::Hash do
30
30
  describe "with a block" do
31
31
 
32
32
  before do
33
- @result = @hash.send(method) { |x| x == key }
33
+ @result = @hash.send(method) { |k, v| k == key }
34
34
  end
35
35
 
36
36
  it "returns #{expected.inspect}" do
@@ -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) { |maximum, item| item.length <=> maximum.length }
35
+ @result = original.send(method) { |minimum, item| item.length <=> minimum.length }
36
36
  end
37
37
 
38
38
  it "returns #{expected.inspect}" do
@@ -80,8 +80,8 @@ describe Hamster::List do
80
80
 
81
81
  describe "and no block" do
82
82
 
83
- it "returns the first value in the list" do
84
- @list.send(method).should == values.first
83
+ it "returns nil" do
84
+ @list.send(method).should be_nil
85
85
  end
86
86
 
87
87
  end
@@ -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::List do
5
+ describe "Hamster.list#span" do
7
6
 
8
- describe "#span" do
7
+ it "is lazy" do
8
+ lambda { Hamster.stream { |item| fail }.span { true } }.should_not raise_error
9
+ end
9
10
 
10
- it "is lazy" do
11
- lambda { Hamster.stream { fail }.span { true } }.should_not raise_error
12
- end
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 "on #{values.inspect}" do
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 "with a block" do
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 a tuple with two items" do
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 "correctly identifies the remainder" do
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 block" do
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 with two items" do
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 "leaves the remainder empty" do
74
+ it "returns an empty list as the remainder" do
74
75
  @remainder.should be_empty
75
76
  end
76
77
 
@@ -37,11 +37,6 @@ describe Hamster::List do
37
37
  @result.should == values
38
38
  end
39
39
 
40
- it "works with splat" do
41
- array = *@list
42
- array.should == values
43
- end
44
-
45
40
  it "returns a mutable array" do
46
41
  @result.last.should_not == "The End"
47
42
  @result << "The End"
@@ -44,6 +44,11 @@ describe Hamster::List do
44
44
  func(*@list)
45
45
  end
46
46
 
47
+ it "works with splat" do
48
+ array = *@list
49
+ array.should == ["A", "B", "C", "D"]
50
+ end
51
+
47
52
  end
48
53
 
49
54
  end
@@ -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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- pending do
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
- describe "when empty" do
11
+ [
12
+ [[], 10, 10],
13
+ [[1], 10, 9],
14
+ [[1, 2, 3], 10, 4],
15
+ ].each do |values, initial, expected|
12
16
 
13
- before do
14
- @original = Hamster.set
15
- @result = @original.send(method, "ABC") {}
16
- end
17
+ describe "on #{values.inspect}" do
17
18
 
18
- it "returns the memo" do
19
- @result.should == "ABC"
20
- end
19
+ before do
20
+ @set = Hamster.set(*values)
21
+ end
21
22
 
22
- end
23
+ describe "with an initial value of #{initial}" do
23
24
 
24
- describe "when not empty" do
25
+ describe "and a block" do
25
26
 
26
- before do
27
- @original = Hamster.set("A", "B", "C")
28
- end
27
+ it "returns #{expected.inspect}" do
28
+ @set.send(method, initial) { |memo, item| memo - item }.should == expected
29
+ end
29
30
 
30
- describe "with a block" do
31
+ end
31
32
 
32
- before do
33
- @result = @original.send(method, 0) { |memo, item| memo + 1 }
34
- end
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
- describe "with no block" do
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
- @result = @original.send(method, "ABC")
56
+ @set = Hamster.set(*values)
46
57
  end
47
58
 
48
- it "returns the memo" do
49
- @result.should == "ABC"
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
@@ -23,11 +23,6 @@ describe Hamster::Tuple do
23
23
  @result.should == values
24
24
  end
25
25
 
26
- it "works with splat" do
27
- array = *@tuple
28
- array.should == values
29
- end
30
-
31
26
  it "returns a mutable array" do
32
27
  @result.last.should_not == "The End"
33
28
  @result << "The End"
@@ -32,6 +32,11 @@ describe Hamster::Tuple do
32
32
  func(*@tuple)
33
33
  end
34
34
 
35
+ it "works with splat" do
36
+ array = *@tuple
37
+ array.should == ["A", "B", "C", "D"]
38
+ end
39
+
35
40
  end
36
41
 
37
42
  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.9
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-11 00:00:00 +11:00
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