hamster 0.1.21 → 0.1.22

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.
Files changed (37) hide show
  1. data/History.rdoc +26 -0
  2. data/lib/hamster/hash.rb +0 -1
  3. data/lib/hamster/list.rb +37 -6
  4. data/lib/hamster/set.rb +34 -20
  5. data/lib/hamster/stack.rb +9 -0
  6. data/lib/hamster/trie.rb +1 -0
  7. data/lib/hamster/version.rb +1 -1
  8. data/spec/hamster/hash/each_spec.rb +2 -2
  9. data/spec/hamster/list/chunk_spec.rb +38 -0
  10. data/spec/hamster/list/{sort_by_spec.rb → count_spec.rb} +13 -18
  11. data/spec/hamster/list/find_spec.rb +1 -1
  12. data/spec/hamster/list/include_spec.rb +1 -1
  13. data/spec/hamster/{set/sort_spec.rb → list/init_spec.rb} +9 -8
  14. data/spec/hamster/list/{sort_spec.rb → intersperse_spec.rb} +4 -4
  15. data/spec/hamster/list/last_spec.rb +34 -0
  16. data/spec/hamster/list/maximum_spec.rb +8 -6
  17. data/spec/hamster/list/minimum_spec.rb +8 -6
  18. data/spec/hamster/list/partition_spec.rb +3 -3
  19. data/spec/hamster/list/sorting_spec.rb +82 -0
  20. data/spec/hamster/list/tail_spec.rb +6 -1
  21. data/spec/hamster/list/union_spec.rb +68 -0
  22. data/spec/hamster/list/uniq_spec.rb +57 -0
  23. data/spec/hamster/list/zip_spec.rb +3 -3
  24. data/spec/hamster/set/count_spec.rb +54 -0
  25. data/spec/hamster/set/each_spec.rb +2 -2
  26. data/spec/hamster/set/find_spec.rb +53 -0
  27. data/spec/hamster/set/include_spec.rb +1 -1
  28. data/spec/hamster/set/join_spec.rb +61 -0
  29. data/spec/hamster/set/maximum_spec.rb +69 -0
  30. data/spec/hamster/set/minimum_spec.rb +69 -0
  31. data/spec/hamster/set/partition_spec.rb +70 -0
  32. data/spec/hamster/set/sorting_spec.rb +58 -0
  33. data/spec/hamster/set/{to_list.rb → to_list_spec.rb} +1 -0
  34. data/spec/hamster/stack/to_a_spec.rb +36 -0
  35. data/spec/hamster/stack/to_list_spec.rb +33 -0
  36. metadata +20 -7
  37. data/spec/hamster/set/sort_by_spec.rb +0 -60
data/History.rdoc CHANGED
@@ -1,3 +1,29 @@
1
+ === 0.1.22 / 2010-01-10
2
+
3
+ * Implement List#union (aliased as #|).
4
+
5
+ * Implement List#uniq (aliased as #nub).
6
+
7
+ * Implement List#intersperse.
8
+
9
+ * Alias #include? as #elem?
10
+
11
+ * Implement Stack#to_list.
12
+
13
+ * Implement Stack#to_a.
14
+
15
+ * Implement Set#join.
16
+
17
+ * Implement Set#count.
18
+
19
+ * Implement List#count.
20
+
21
+ * Alias #include? as #contains?
22
+
23
+ * #each now returns nil if you specify a block.
24
+
25
+ * Implement Set#find (aliased as #detect).
26
+
1
27
  === 0.1.21 / 2010-01-08
2
28
 
3
29
  * Implement List#sort. (Very, VERY inefficient implementation!)
data/lib/hamster/hash.rb CHANGED
@@ -54,7 +54,6 @@ module Hamster
54
54
  def each
55
55
  return self unless block_given?
56
56
  @trie.each { |entry| yield(entry.key, entry.value) }
57
- self
58
57
  end
59
58
 
60
59
  def map
data/lib/hamster/list.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'monitor'
2
2
 
3
+ require 'hamster/set'
4
+
3
5
  module Hamster
4
6
 
5
7
  class << self
@@ -127,10 +129,11 @@ module Hamster
127
129
  end
128
130
 
129
131
  def include?(object)
130
- each { |item| return true if object == item }
131
- false
132
+ any? { |item| item == object }
132
133
  end
133
134
  alias_method :member?, :include?
135
+ alias_method :contains?, :include?
136
+ alias_method :elem?, :include?
134
137
 
135
138
  def any?
136
139
  return any? { |item| item } unless block_given?
@@ -222,12 +225,19 @@ module Hamster
222
225
  span { |item| !yield(item) }
223
226
  end
224
227
 
228
+ def count(&block)
229
+ return length unless block_given?
230
+ count = 0
231
+ each { |item| count += 1 if yield(item) }
232
+ count
233
+ end
234
+
225
235
  def clear
226
236
  EmptyList
227
237
  end
228
238
 
229
- def sort
230
- sort_by { |item| item }
239
+ def sort(&block)
240
+ Hamster.list(*to_a.sort(&block))
231
241
  end
232
242
 
233
243
  def sort_by(&block)
@@ -235,9 +245,30 @@ module Hamster
235
245
  Hamster.list(*to_a.sort_by(&block))
236
246
  end
237
247
 
238
- def join(sep = nil)
239
- to_a.join(sep)
248
+ def join(sep = "")
249
+ sep = sep.to_s
250
+ tail.reduce(head.to_s) { |string, item| string << sep << item.to_s }
251
+ end
252
+
253
+ def intersperse(sep)
254
+ return self if tail.empty?
255
+ Stream.new(head) { Stream.new(sep) { tail.intersperse(sep) } }
256
+ end
257
+
258
+ def uniq(items = Set.new)
259
+ list = self
260
+ while !list.empty? && items.include?(list.head)
261
+ list = list.tail
262
+ end
263
+ return list if list.empty?
264
+ Stream.new(list.head) { list.tail.uniq(items.add(list.head)) }
265
+ end
266
+ alias_method :nub, :uniq
267
+
268
+ def union(other)
269
+ self.append(other).uniq
240
270
  end
271
+ alias_method :|, :union
241
272
 
242
273
  def eql?(other)
243
274
  return false unless other.is_a?(List)
data/lib/hamster/set.rb CHANGED
@@ -27,6 +27,8 @@ module Hamster
27
27
  @trie.has_key?(item)
28
28
  end
29
29
  alias_method :member?, :include?
30
+ alias_method :contains?, :include?
31
+ alias_method :elem?, :include?
30
32
 
31
33
  def add(item)
32
34
  if include?(item)
@@ -49,7 +51,6 @@ module Hamster
49
51
  def each
50
52
  return self unless block_given?
51
53
  @trie.each { |entry| yield(entry.key) }
52
- self
53
54
  end
54
55
 
55
56
  def map
@@ -88,52 +89,65 @@ module Hamster
88
89
  alias_method :delete_if, :reject
89
90
 
90
91
  def any?
91
- if block_given?
92
- each { |item| return true if yield(item) }
93
- else
94
- each { |item| return true if item }
95
- end
92
+ return any? { |item| item } unless block_given?
93
+ each { |item| return true if yield(item) }
96
94
  false
97
95
  end
98
96
  alias_method :exist?, :any?
99
97
  alias_method :exists?, :any?
100
98
 
101
99
  def all?
102
- if block_given?
103
- each { |item| return false unless yield(item) }
104
- else
105
- each { |item| return false unless item }
106
- end
100
+ return all? { |item| item } unless block_given?
101
+ each { |item| return false unless yield(item) }
107
102
  true
108
103
  end
109
104
 
110
105
  def none?
111
- if block_given?
112
- each { |item| return false if yield(item) }
113
- else
114
- each { |item| return false if item }
115
- end
106
+ return none? { |item| item } unless block_given?
107
+ each { |item| return false if yield(item) }
116
108
  true
117
109
  end
118
110
 
111
+ def find
112
+ return nil unless block_given?
113
+ each { |item| return item if yield(item) }
114
+ nil
115
+ end
116
+ alias_method :detect, :find
117
+
118
+ def partition(&block)
119
+ return self unless block_given?
120
+ Stream.new(filter(&block)) { Sequence.new(reject(&block)) }
121
+ end
122
+
119
123
  def grep(pattern, &block)
120
124
  filter { |item| pattern === item }.map(&block)
121
125
  end
122
126
 
127
+ def count(&block)
128
+ return length unless block_given?
129
+ count = 0
130
+ each { |item| count += 1 if yield(item) }
131
+ count
132
+ end
133
+
123
134
  def head
124
- each { |item| return item }
125
- nil
135
+ find { true }
126
136
  end
127
137
  alias_method :first, :head
128
138
 
129
- def sort
130
- to_list.sort
139
+ def sort(&block)
140
+ to_list.sort(&block)
131
141
  end
132
142
 
133
143
  def sort_by(&block)
134
144
  to_list.sort_by(&block)
135
145
  end
136
146
 
147
+ def join(sep = nil)
148
+ to_a.join(sep)
149
+ end
150
+
137
151
  def eql?(other)
138
152
  other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
139
153
  end
data/lib/hamster/stack.rb CHANGED
@@ -55,6 +55,15 @@ module Hamster
55
55
  end
56
56
  alias_method :clone, :dup
57
57
 
58
+ def to_a
59
+ @list.to_a
60
+ end
61
+ alias_method :entries, :to_a
62
+
63
+ def to_list
64
+ @list
65
+ end
66
+
58
67
  def inspect
59
68
  @list.inspect
60
69
  end
data/lib/hamster/trie.rb CHANGED
@@ -31,6 +31,7 @@ module Hamster
31
31
  @children.each do |child|
32
32
  child.each { |entry| yield(entry) } if child
33
33
  end
34
+ nil
34
35
  end
35
36
 
36
37
  def reduce(memo)
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.1.21".freeze
3
+ VERSION = "0.1.22".freeze
4
4
 
5
5
  end
@@ -12,8 +12,8 @@ describe Hamster::Hash do
12
12
 
13
13
  describe "with a block (internal iteration)" do
14
14
 
15
- it "returns self" do
16
- @hash.each {}.should equal(@hash)
15
+ it "returns nil" do
16
+ @hash.each {}.should be_nil
17
17
  end
18
18
 
19
19
  it "yields all key/value pairs" do
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#chunk" do
8
+
9
+ [
10
+ [[], []],
11
+ [["A"], [Hamster.list("A")]],
12
+ [["A", "B", "C"], [Hamster.list("A", "B"), Hamster.list("C")]],
13
+ ].each do |values, expected|
14
+
15
+ describe "on #{values.inspect}" do
16
+
17
+ before do
18
+ @original = Hamster.list(*values)
19
+ pending do
20
+ @result = @original.chunk(2)
21
+ end
22
+ end
23
+
24
+ it "preserves the original" do
25
+ @original.should == Hamster.list(*values)
26
+ end
27
+
28
+ it "returns #{expected.inspect}" do
29
+ @result.should == Hamster.list(*expected)
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -4,7 +4,7 @@ require 'hamster/list'
4
4
 
5
5
  describe Hamster::List do
6
6
 
7
- describe "#sort_by" do
7
+ describe "#count" do
8
8
 
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
@@ -17,15 +17,18 @@ describe Hamster::List do
17
17
  end
18
18
 
19
19
  after do
20
- @list.sort_by { |item| item }
20
+ @list.count { true }
21
21
  end
22
22
 
23
23
  end
24
24
 
25
25
  [
26
- [[], []],
27
- [["A"], ["A"]],
28
- [["Ichi", "Ni", "San"], ["Ni", "San", "Ichi"]],
26
+ [[], 0],
27
+ [[1], 1],
28
+ [[1, 2], 1],
29
+ [[1, 2, 3], 2],
30
+ [[1, 2, 3, 4], 2],
31
+ [[1, 2, 3, 4, 5], 3],
29
32
  ].each do |values, expected|
30
33
 
31
34
  describe "on #{values.inspect}" do
@@ -37,15 +40,11 @@ describe Hamster::List do
37
40
  describe "with a block" do
38
41
 
39
42
  before do
40
- @result = @original.sort_by { |item| item.length }
41
- end
42
-
43
- it "preserves the original" do
44
- @original.should == Hamster.list(*values)
43
+ @result = @original.count(&:odd?)
45
44
  end
46
45
 
47
46
  it "returns #{expected.inspect}" do
48
- @result.should == Hamster.list(*expected)
47
+ @result.should == expected
49
48
  end
50
49
 
51
50
  end
@@ -53,15 +52,11 @@ describe Hamster::List do
53
52
  describe "without a block" do
54
53
 
55
54
  before do
56
- @result = @original.sort_by
57
- end
58
-
59
- it "preserves the original" do
60
- @original.should == Hamster.list(*values)
55
+ @result = @original.count
61
56
  end
62
57
 
63
- it "returns #{expected.sort.inspect}" do
64
- @result.should == Hamster.list(*expected.sort)
58
+ it "returns length" do
59
+ @result.should == @original.length
65
60
  end
66
61
 
67
62
  end
@@ -45,7 +45,7 @@ describe Hamster::List do
45
45
  describe "with a block" do
46
46
 
47
47
  it "returns #{expected.inspect}" do
48
- @list.send(method) { |x| x == item }.should == expected
48
+ @list.send(method) { |x| x == item }.should == expected
49
49
  end
50
50
 
51
51
  end
@@ -4,7 +4,7 @@ require 'hamster/list'
4
4
 
5
5
  describe Hamster::List do
6
6
 
7
- [:include?, :member?].each do |method|
7
+ [:include?, :member?, :contains?, :elem?].each do |method|
8
8
 
9
9
  describe "##{method}" do
10
10
 
@@ -1,27 +1,28 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
- require 'hamster/set'
4
3
  require 'hamster/list'
5
4
 
6
- describe Hamster::Set do
5
+ describe Hamster::List do
7
6
 
8
- describe "#sort" do
7
+ describe "#init" do
9
8
 
10
9
  [
11
10
  [[], []],
12
- [["A"], ["A"]],
13
- [["C", "A", "B"], ["A", "B", "C"]],
11
+ [["A"], []],
12
+ [["A", "B", "C"], ["A", "B"]],
14
13
  ].each do |values, expected|
15
14
 
16
15
  describe "on #{values.inspect}" do
17
16
 
18
17
  before do
19
- @original = Hamster.set(*values)
20
- @result = @original.sort
18
+ @original = Hamster.list(*values)
19
+ pending do
20
+ @result = @original.init
21
+ end
21
22
  end
22
23
 
23
24
  it "preserves the original" do
24
- @original.should == Hamster.set(*values)
25
+ @original.should == Hamster.list(*values)
25
26
  end
26
27
 
27
28
  it "returns #{expected.inspect}" do
@@ -4,7 +4,7 @@ require 'hamster/list'
4
4
 
5
5
  describe Hamster::List do
6
6
 
7
- describe "#sort" do
7
+ describe "#intersperse" do
8
8
 
9
9
  describe "doesn't run out of stack space on a really big" do
10
10
 
@@ -17,7 +17,7 @@ describe Hamster::List do
17
17
  end
18
18
 
19
19
  after do
20
- @list.sort
20
+ @list.intersperse(":")
21
21
  end
22
22
 
23
23
  end
@@ -25,14 +25,14 @@ describe Hamster::List do
25
25
  [
26
26
  [[], []],
27
27
  [["A"], ["A"]],
28
- [["C", "A", "B"], ["A", "B", "C"]],
28
+ [["A", "B", "C"], ["A", "|", "B", "|", "C"]]
29
29
  ].each do |values, expected|
30
30
 
31
31
  describe "on #{values.inspect}" do
32
32
 
33
33
  before do
34
34
  @original = Hamster.list(*values)
35
- @result = @original.sort
35
+ @result = @original.intersperse("|")
36
36
  end
37
37
 
38
38
  it "preserves the original" do