hamster 0.1.20 → 0.1.21

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.1.21 / 2010-01-08
2
+
3
+ * Implement List#sort. (Very, VERY inefficient implementation!)
4
+
5
+ * Implement List#sort_by. (Very, VERY inefficient implementation!)
6
+
7
+ * Implement Set#to_set.
8
+
9
+ * Implement Set#inspect.
10
+
11
+ * Implement Set#first (aliased as #head).
12
+
13
+ * Implement Set#sort. (Very, VERY inefficient implementation!)
14
+
15
+ * Implement Set#sort_by. (Very, VERY inefficient implementation!)
16
+
17
+ * Implement List#join.
18
+
1
19
  === 0.1.20 / 2010-01-07
2
20
 
3
21
  * Implement Stack#clear.
@@ -2,8 +2,6 @@ require 'monitor'
2
2
 
3
3
  module Hamster
4
4
 
5
- Undefined = Object.new
6
-
7
5
  class << self
8
6
 
9
7
  def list(*items)
@@ -22,11 +20,11 @@ module Hamster
22
20
  alias_method :range, :interval
23
21
 
24
22
  def repeat(item)
25
- Sequence.new(item)
23
+ Stream.new(item) { repeat(item) }
26
24
  end
27
25
 
28
26
  def replicate(number, item)
29
- Sequence.new(item).take(number)
27
+ repeat(item).take(number)
30
28
  end
31
29
 
32
30
  def iterate(item, &block)
@@ -37,6 +35,8 @@ module Hamster
37
35
 
38
36
  module List
39
37
 
38
+ Undefined = Object.new
39
+
40
40
  def empty?
41
41
  false
42
42
  end
@@ -170,7 +170,7 @@ module Hamster
170
170
 
171
171
  def partition(&block)
172
172
  return self unless block_given?
173
- Stream.new(filter(&block)) { EmptyList.cons(reject(&block)) }
173
+ Stream.new(filter(&block)) { Sequence.new(reject(&block)) }
174
174
  end
175
175
 
176
176
  def append(other)
@@ -201,7 +201,7 @@ module Hamster
201
201
  end
202
202
 
203
203
  def zip(other)
204
- Stream.new(EmptyList.cons(other.head).cons(head)) { tail.zip(other.tail) }
204
+ Stream.new(Sequence.new(other.head).cons(head)) { tail.zip(other.tail) }
205
205
  end
206
206
 
207
207
  def cycle
@@ -209,17 +209,16 @@ module Hamster
209
209
  end
210
210
 
211
211
  def split_at(number)
212
- # Stream.new(take(number)) { EmptyList.cons(drop(number)) }
213
- EmptyList.cons(drop(number)).cons(take(number))
212
+ Sequence.new(drop(number)).cons(take(number))
214
213
  end
215
214
 
216
215
  def span(&block)
217
- return EmptyList.cons(EmptyList).cons(self) unless block_given?
218
- Stream.new(take_while(&block)) { EmptyList.cons(drop_while(&block)) }
216
+ return Sequence.new(EmptyList).cons(self) unless block_given?
217
+ Stream.new(take_while(&block)) { Sequence.new(drop_while(&block)) }
219
218
  end
220
219
 
221
220
  def break(&block)
222
- return EmptyList.cons(EmptyList).cons(self) unless block_given?
221
+ return Sequence.new(EmptyList).cons(self) unless block_given?
223
222
  span { |item| !yield(item) }
224
223
  end
225
224
 
@@ -227,6 +226,19 @@ module Hamster
227
226
  EmptyList
228
227
  end
229
228
 
229
+ def sort
230
+ sort_by { |item| item }
231
+ end
232
+
233
+ def sort_by(&block)
234
+ return sort unless block_given?
235
+ Hamster.list(*to_a.sort_by(&block))
236
+ end
237
+
238
+ def join(sep = nil)
239
+ to_a.join(sep)
240
+ end
241
+
230
242
  def eql?(other)
231
243
  return false unless other.is_a?(List)
232
244
 
@@ -293,7 +305,7 @@ module Hamster
293
305
  attr_reader :head, :tail
294
306
  alias_method :first, :head
295
307
 
296
- def initialize(head, tail = self)
308
+ def initialize(head, tail = EmptyList)
297
309
  @head = head
298
310
  @tail = tail
299
311
  end
@@ -120,6 +120,20 @@ module Hamster
120
120
  filter { |item| pattern === item }.map(&block)
121
121
  end
122
122
 
123
+ def head
124
+ each { |item| return item }
125
+ nil
126
+ end
127
+ alias_method :first, :head
128
+
129
+ def sort
130
+ to_list.sort
131
+ end
132
+
133
+ def sort_by(&block)
134
+ to_list.sort_by(&block)
135
+ end
136
+
123
137
  def eql?(other)
124
138
  other.is_a?(self.class) && @trie.eql?(other.instance_eval{@trie})
125
139
  end
@@ -131,6 +145,7 @@ module Hamster
131
145
  alias_method :clone, :dup
132
146
  alias_method :uniq, :dup
133
147
  alias_method :nub, :dup
148
+ alias_method :to_set, :dup
134
149
 
135
150
  def to_a
136
151
  reduce([]) { |a, item| a << item }
@@ -141,6 +156,10 @@ module Hamster
141
156
  reduce(Hamster.list) { |list, item| list.cons(item) }
142
157
  end
143
158
 
159
+ def inspect
160
+ "{#{to_a.inspect[1..-2]}}"
161
+ end
162
+
144
163
  end
145
164
 
146
165
  end
@@ -1,5 +1,5 @@
1
1
  module Hamster
2
2
 
3
- VERSION = "0.1.20".freeze
3
+ VERSION = "0.1.21".freeze
4
4
 
5
5
  end
@@ -0,0 +1,77 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#join" do
8
+
9
+ describe "doesn't run out of stack space on a really big" do
10
+
11
+ it "stream" do
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
+ end
14
+
15
+ it "list" do
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
+ end
18
+
19
+ after do
20
+ @list.join
21
+ end
22
+
23
+ end
24
+
25
+ describe "with a separator" do
26
+
27
+ [
28
+ [[], ""],
29
+ [["A"], "A"],
30
+ [["A", "B", "C"], "A|B|C"]
31
+ ].each do |values, expected|
32
+
33
+ describe "on #{values.inspect}" do
34
+
35
+ before do
36
+ original = Hamster.list(*values)
37
+ @result = original.join("|")
38
+ end
39
+
40
+ it "returns #{expected.inspect}" do
41
+ @result.should == expected
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ describe "without a separator" do
51
+
52
+ [
53
+ [[], ""],
54
+ [["A"], "A"],
55
+ [["A", "B", "C"], "ABC"]
56
+ ].each do |values, expected|
57
+
58
+ describe "on #{values.inspect}" do
59
+
60
+ before do
61
+ original = Hamster.list(*values)
62
+ @result = original.join
63
+ end
64
+
65
+ it "returns #{expected.inspect}" do
66
+ @result.should == expected
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+
77
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#sort_by" do
8
+
9
+ describe "doesn't run out of stack space on a really big" do
10
+
11
+ it "stream" do
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
+ end
14
+
15
+ it "list" do
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
+ end
18
+
19
+ after do
20
+ @list.sort_by { |item| item }
21
+ end
22
+
23
+ end
24
+
25
+ [
26
+ [[], []],
27
+ [["A"], ["A"]],
28
+ [["Ichi", "Ni", "San"], ["Ni", "San", "Ichi"]],
29
+ ].each do |values, expected|
30
+
31
+ describe "on #{values.inspect}" do
32
+
33
+ before do
34
+ @original = Hamster.list(*values)
35
+ end
36
+
37
+ describe "with a block" do
38
+
39
+ 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)
45
+ end
46
+
47
+ it "returns #{expected.inspect}" do
48
+ @result.should == Hamster.list(*expected)
49
+ end
50
+
51
+ end
52
+
53
+ describe "without a block" do
54
+
55
+ before do
56
+ @result = @original.sort_by
57
+ end
58
+
59
+ it "preserves the original" do
60
+ @original.should == Hamster.list(*values)
61
+ end
62
+
63
+ it "returns #{expected.sort.inspect}" do
64
+ @result.should == Hamster.list(*expected.sort)
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+
73
+ end
74
+
75
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/list'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#sort" do
8
+
9
+ describe "doesn't run out of stack space on a really big" do
10
+
11
+ it "stream" do
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
+ end
14
+
15
+ it "list" do
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
+ end
18
+
19
+ after do
20
+ @list.sort
21
+ end
22
+
23
+ end
24
+
25
+ [
26
+ [[], []],
27
+ [["A"], ["A"]],
28
+ [["C", "A", "B"], ["A", "B", "C"]],
29
+ ].each do |values, expected|
30
+
31
+ describe "on #{values.inspect}" do
32
+
33
+ before do
34
+ @original = Hamster.list(*values)
35
+ @result = @original.sort
36
+ end
37
+
38
+ it "preserves the original" do
39
+ @original.should == Hamster.list(*values)
40
+ end
41
+
42
+ it "returns #{expected.inspect}" do
43
+ @result.should == Hamster.list(*expected)
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/set'
4
+
5
+ describe Hamster::Set do
6
+
7
+ [:head, :first].each do |method|
8
+
9
+ describe "##{method}" do
10
+
11
+ [
12
+ [[], nil],
13
+ [["A"], "A"],
14
+ [[1, 2, 3], 1],
15
+ ].each do |values, expected|
16
+
17
+ describe "on #{values.inspect}" do
18
+
19
+ before do
20
+ original = Hamster.set(*values)
21
+ @result = original.send(method)
22
+ end
23
+
24
+ it "returns #{expected.inspect}" do
25
+ @result.should == expected
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/set'
4
+
5
+ describe Hamster::List do
6
+
7
+ describe "#inspect" do
8
+
9
+ describe "doesn't run out of stack space on a really big" do
10
+
11
+ it "stream" do
12
+ @list = Hamster.interval(0, STACK_OVERFLOW_DEPTH)
13
+ end
14
+
15
+ it "list" do
16
+ @list = (0...STACK_OVERFLOW_DEPTH).reduce(Hamster.list) { |list, i| list.cons(i) }
17
+ end
18
+
19
+ after do
20
+ @list.inspect
21
+ end
22
+
23
+ end
24
+
25
+ [
26
+ [[], "{}"],
27
+ [["A"], "{\"A\"}"],
28
+ [[1, 2, 3], "{1, 2, 3}"]
29
+ ].each do |values, expected|
30
+
31
+ describe "on #{values.inspect}" do
32
+
33
+ before do
34
+ original = Hamster.set(*values)
35
+ @result = original.inspect
36
+ end
37
+
38
+ it "returns #{expected.inspect}" do
39
+ @result.should == expected
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -0,0 +1,60 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/set'
4
+ require 'hamster/list'
5
+
6
+ describe Hamster::List do
7
+
8
+ describe "#sort_by" do
9
+
10
+ [
11
+ [[], []],
12
+ [["A"], ["A"]],
13
+ [["Ichi", "Ni", "San"], ["Ni", "San", "Ichi"]],
14
+ ].each do |values, expected|
15
+
16
+ describe "on #{values.inspect}" do
17
+
18
+ before do
19
+ @original = Hamster.set(*values)
20
+ end
21
+
22
+ describe "with a block" do
23
+
24
+ before do
25
+ @result = @original.sort_by { |item| item.length }
26
+ end
27
+
28
+ it "preserves the original" do
29
+ @original.should == Hamster.set(*values)
30
+ end
31
+
32
+ it "returns #{expected.inspect}" do
33
+ @result.should == Hamster.list(*expected)
34
+ end
35
+
36
+ end
37
+
38
+ describe "without a block" do
39
+
40
+ before do
41
+ @result = @original.sort_by
42
+ end
43
+
44
+ it "preserves the original" do
45
+ @original.should == Hamster.set(*values)
46
+ end
47
+
48
+ it "returns #{expected.sort.inspect}" do
49
+ @result.should == Hamster.list(*expected.sort)
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/set'
4
+ require 'hamster/list'
5
+
6
+ describe Hamster::Set do
7
+
8
+ describe "#sort" do
9
+
10
+ [
11
+ [[], []],
12
+ [["A"], ["A"]],
13
+ [["C", "A", "B"], ["A", "B", "C"]],
14
+ ].each do |values, expected|
15
+
16
+ describe "on #{values.inspect}" do
17
+
18
+ before do
19
+ @original = Hamster.set(*values)
20
+ @result = @original.sort
21
+ end
22
+
23
+ it "preserves the original" do
24
+ @original.should == Hamster.set(*values)
25
+ end
26
+
27
+ it "returns #{expected.inspect}" do
28
+ @result.should == Hamster.list(*expected)
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ require 'hamster/set'
4
+
5
+ describe Hamster::Set do
6
+
7
+ describe "#to_set" do
8
+
9
+ [
10
+ [],
11
+ ["A"],
12
+ ["A", "B", "C"],
13
+ ].each do |values|
14
+
15
+ describe "on #{values.inspect}" do
16
+
17
+ before do
18
+ @original = Hamster.set(*values)
19
+ @result = @original.to_set
20
+ end
21
+
22
+ it "returns self" do
23
+ @result.should equal(@original)
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ 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.1.20
4
+ version: 0.1.21
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-01-07 00:00:00 +11:00
12
+ date: 2010-01-08 00:00:00 +11:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -84,6 +84,7 @@ files:
84
84
  - spec/hamster/list/head_spec.rb
85
85
  - spec/hamster/list/include_spec.rb
86
86
  - spec/hamster/list/inspect_spec.rb
87
+ - spec/hamster/list/join_spec.rb
87
88
  - spec/hamster/list/map_spec.rb
88
89
  - spec/hamster/list/maximum_spec.rb
89
90
  - spec/hamster/list/minimum_spec.rb
@@ -94,6 +95,8 @@ files:
94
95
  - spec/hamster/list/reject_spec.rb
95
96
  - spec/hamster/list/reverse_spec.rb
96
97
  - spec/hamster/list/size_spec.rb
98
+ - spec/hamster/list/sort_by_spec.rb
99
+ - spec/hamster/list/sort_spec.rb
97
100
  - spec/hamster/list/span_spec.rb
98
101
  - spec/hamster/list/split_at_spec.rb
99
102
  - spec/hamster/list/tail_spec.rb
@@ -113,15 +116,20 @@ files:
113
116
  - spec/hamster/set/eql_spec.rb
114
117
  - spec/hamster/set/filter_spec.rb
115
118
  - spec/hamster/set/grep_spec.rb
119
+ - spec/hamster/set/head_spec.rb
116
120
  - spec/hamster/set/include_spec.rb
121
+ - spec/hamster/set/inspect_spec.rb
117
122
  - spec/hamster/set/map_spec.rb
118
123
  - spec/hamster/set/none_spec.rb
119
124
  - spec/hamster/set/reduce_spec.rb
120
125
  - spec/hamster/set/reject_spec.rb
121
126
  - spec/hamster/set/remove_spec.rb
122
127
  - spec/hamster/set/size_spec.rb
128
+ - spec/hamster/set/sort_by_spec.rb
129
+ - spec/hamster/set/sort_spec.rb
123
130
  - spec/hamster/set/to_a_spec.rb
124
131
  - spec/hamster/set/to_list.rb
132
+ - spec/hamster/set/to_set_spec.rb
125
133
  - spec/hamster/set/uniq_spec.rb
126
134
  - spec/hamster/stack/clear_spec.rb
127
135
  - spec/hamster/stack/construction_spec.rb