hamster 0.1.20 → 0.1.21

Sign up to get free protection for your applications and to get access to all the features.
@@ -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