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.
@@ -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