stream 0.5
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.
- data/README +174 -0
- data/Rakefile +161 -0
- data/examples/examples.rb +51 -0
- data/examples/streamtester.rb +59 -0
- data/install.rb +24 -0
- data/lib/generator2stream.rb +22 -0
- data/lib/stream.rb +585 -0
- data/test/bm.rb +49 -0
- data/test/testgenerator.rb +24 -0
- data/test/teststream.rb +177 -0
- metadata +64 -0
data/test/bm.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require "benchmark"
|
2
|
+
require "stream"
|
3
|
+
require "generator"
|
4
|
+
|
5
|
+
include Benchmark
|
6
|
+
|
7
|
+
a =(1..5000).to_a
|
8
|
+
s = a.create_stream
|
9
|
+
n = 10
|
10
|
+
g = Generator.new a
|
11
|
+
|
12
|
+
bm(15) do |test|
|
13
|
+
test.report("A.each:") do
|
14
|
+
n.times {a.each {|x| x}}
|
15
|
+
end
|
16
|
+
test.report("S.each:") do
|
17
|
+
n.times {s.each {|x| x}}
|
18
|
+
end
|
19
|
+
test.report("G.each:") do
|
20
|
+
n.times {g.each {|x| x}}
|
21
|
+
end
|
22
|
+
|
23
|
+
test.report("A.collect.first:") do
|
24
|
+
n.times {a.collect {|x| x}.collect {|x| x}.first}
|
25
|
+
end
|
26
|
+
test.report("S.collect.first:") do
|
27
|
+
n.times {s.collect {|x| x}.collect {|x| x}.first}
|
28
|
+
end
|
29
|
+
test.report("G.collect.first:") do
|
30
|
+
n.times {g.collect {|x| x}.collect {|x| x}.first}
|
31
|
+
end
|
32
|
+
|
33
|
+
test.report("A.reverse:") do
|
34
|
+
n.times {a.reverse.reverse.reverse.each {|x| x}}
|
35
|
+
end
|
36
|
+
test.report("S.reverse:") do
|
37
|
+
n.times {s.reverse.reverse.reverse.each {|x| x}}
|
38
|
+
end
|
39
|
+
|
40
|
+
test.report("A.collect:") do
|
41
|
+
n.times {a.collect {|x| x}.collect {|x| x}.each {|x| x}}
|
42
|
+
end
|
43
|
+
test.report("S.collect:") do
|
44
|
+
n.times {s.collect {|x| x}.collect {|x| x}.each {|x| x}}
|
45
|
+
end
|
46
|
+
test.report("G.collect:") do
|
47
|
+
n.times {g.collect {|x| x}.collect {|x| x}.each {|x| x}}
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'generator2stream'
|
3
|
+
|
4
|
+
class TestGenerator < Test::Unit::TestCase
|
5
|
+
include Stream
|
6
|
+
|
7
|
+
def test_generator
|
8
|
+
# Use WrappedStream to ensure that the stream protocol is used and
|
9
|
+
# not the Enumerable protocol.
|
10
|
+
g = Generator.new { |g|
|
11
|
+
for i in 1..3
|
12
|
+
g.yield i
|
13
|
+
end
|
14
|
+
g.yield 0
|
15
|
+
}
|
16
|
+
assert_equal([1, 2, 3, 0], WrappedStream.new(g).to_a)
|
17
|
+
|
18
|
+
# Generators are not reversable
|
19
|
+
assert_raises(NotImplementedError) {g.reverse.first}
|
20
|
+
|
21
|
+
a = (1..10).to_a
|
22
|
+
assert_equal(a, WrappedStream.new(Generator.new(a)).to_a)
|
23
|
+
end
|
24
|
+
end
|
data/test/teststream.rb
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'stream'
|
3
|
+
|
4
|
+
module StreamExamples
|
5
|
+
def new_collection_stream; (1..5).create_stream; end
|
6
|
+
|
7
|
+
# a stream which is aquivalent to new_collection_stream
|
8
|
+
def new_implicit_stream
|
9
|
+
s = Stream::ImplicitStream.new { |s|
|
10
|
+
x = 0
|
11
|
+
s.at_beginning_proc = proc {x < 1}
|
12
|
+
s.at_end_proc = proc {x == 5}
|
13
|
+
s.forward_proc = proc {x += 1 }
|
14
|
+
s.backward_proc = proc {y = x; x -= 1; y }
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def filtered_streams
|
19
|
+
[
|
20
|
+
new_collection_stream.filtered { |x| true },
|
21
|
+
new_collection_stream.filtered { |x| false },
|
22
|
+
new_collection_stream.filtered { |x| x > 3 },
|
23
|
+
new_collection_stream.filtered { |x| x % 2 == 0 },
|
24
|
+
new_collection_stream.filtered { |x| x % 2 == 0 }.filtered { |x| x > 3 }
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
def new_concatenated_stream
|
29
|
+
[1, 2, 3].create_stream.concatenate_collected { |i|
|
30
|
+
[i,-i].create_stream
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def all_examples
|
35
|
+
[
|
36
|
+
new_collection_stream,
|
37
|
+
new_implicit_stream,
|
38
|
+
new_collection_stream.remove_first,
|
39
|
+
new_collection_stream.remove_last,
|
40
|
+
new_collection_stream.remove_first.remove_last,
|
41
|
+
Stream::WrappedStream.new(new_collection_stream),
|
42
|
+
Stream::IntervalStream.new(6),
|
43
|
+
Stream::IntervalStream.new(1),
|
44
|
+
new_collection_stream.collect { |x| x * 2 },
|
45
|
+
|
46
|
+
# Some concatenated streams
|
47
|
+
Stream::EmptyStream.instance.concatenate,
|
48
|
+
new_concatenated_stream,
|
49
|
+
# concatenated inside concatenated
|
50
|
+
new_concatenated_stream + new_concatenated_stream,
|
51
|
+
new_collection_stream + Stream::EmptyStream.instance,
|
52
|
+
Stream::EmptyStream.instance + new_collection_stream
|
53
|
+
].concat(filtered_streams)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def standard_tests_for(s)
|
59
|
+
arrayStream = s.to_a.create_stream # A collection stream that should be OK
|
60
|
+
assert_equal(s.to_a, arrayStream.to_a)
|
61
|
+
# Tests at end of stream
|
62
|
+
assert_equal(s.at_end?, arrayStream.at_end?)
|
63
|
+
assert_raises(Stream::EndOfStreamException) {s.forward}
|
64
|
+
assert_equal(s.at_beginning?, arrayStream.at_beginning?)
|
65
|
+
assert_equal(s.peek,s)
|
66
|
+
unless arrayStream.at_beginning?
|
67
|
+
assert_equal(arrayStream.current,s.current)
|
68
|
+
assert_equal(arrayStream.backward, s.backward)
|
69
|
+
end
|
70
|
+
assert_equal(arrayStream.at_end?, s.at_end?)
|
71
|
+
|
72
|
+
# Tests at begin of stream
|
73
|
+
s.set_to_begin; arrayStream.set_to_begin
|
74
|
+
assert_raises(Stream::EndOfStreamException) {s.backward}
|
75
|
+
assert_equal(s.at_beginning?,arrayStream.at_beginning?)
|
76
|
+
assert_equal(s.at_end?,arrayStream.at_end?)
|
77
|
+
assert_equal(s.current,s)
|
78
|
+
unless arrayStream.at_end?
|
79
|
+
assert_equal(s.peek,arrayStream.peek)
|
80
|
+
assert_equal(s.forward,arrayStream.forward)
|
81
|
+
assert_equal(s.current,arrayStream.current)
|
82
|
+
unless arrayStream.at_end?
|
83
|
+
assert_equal(s.peek,arrayStream.peek)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
class TestStream < Test::Unit::TestCase
|
91
|
+
include StreamExamples
|
92
|
+
|
93
|
+
def test_enumerable
|
94
|
+
s = new_collection_stream
|
95
|
+
assert_equal([2, 4, 6, 8, 10], s.collect {|x| x*2}.entries)
|
96
|
+
assert_equal([2,4],s.select {|x| x[0]== 0})# even numbers
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_collection_stream
|
100
|
+
s = new_collection_stream
|
101
|
+
assert_equal([1, 2, 3, 4, 5], s.entries)
|
102
|
+
assert(s.at_end?)
|
103
|
+
assert_raises(Stream::EndOfStreamException) {s.forward}
|
104
|
+
assert_equal(5, s.backward)
|
105
|
+
assert_equal(5, s.forward)
|
106
|
+
assert_equal(5, s.current)
|
107
|
+
assert_equal(s, s.peek)
|
108
|
+
|
109
|
+
s.set_to_begin
|
110
|
+
assert(s.at_beginning?)
|
111
|
+
assert_raises(Stream::EndOfStreamException) {s.backward}
|
112
|
+
assert_equal(s, s.current)
|
113
|
+
assert_equal(1, s.peek)
|
114
|
+
assert_equal(1, s.forward)
|
115
|
+
assert_equal(1, s.current)
|
116
|
+
assert_equal(2, s.peek)
|
117
|
+
|
118
|
+
# move_forward_until
|
119
|
+
assert_equal(4, s.move_forward_until { |x| x > 3 })
|
120
|
+
assert_equal(nil, s.move_forward_until { |x| x < 3 })
|
121
|
+
assert(s.at_end?)
|
122
|
+
|
123
|
+
s.set_to_begin
|
124
|
+
assert_equal(nil, s.move_forward_until { |x| x > 6 })
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_standard_for_examples
|
128
|
+
all_examples.each do |exampleStream|
|
129
|
+
standard_tests_for(exampleStream)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_for_examples_reversed
|
134
|
+
all_examples.each do |exampleStream|
|
135
|
+
assert_equal(exampleStream.entries.reverse, exampleStream.reverse.entries)
|
136
|
+
assert_equal(exampleStream.entries, exampleStream.reverse.reverse.entries)
|
137
|
+
standard_tests_for(exampleStream.reverse)
|
138
|
+
standard_tests_for(exampleStream.reverse.reverse)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_filtered_stream
|
143
|
+
[(1..6).create_stream.filtered {|x| x % 2 == 0 }].each do |s|
|
144
|
+
standard_tests_for(s)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_interval_stream
|
149
|
+
s = Stream::IntervalStream.new 6
|
150
|
+
standard_tests_for(s)
|
151
|
+
assert_equal([0, 1, 2, 3, 4, 5], s.entries)
|
152
|
+
s.increment_stop
|
153
|
+
assert(!s.at_end?)
|
154
|
+
assert_equal([0, 1, 2, 3, 4, 5, 6], s.entries)
|
155
|
+
standard_tests_for(s)
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_enumerable_protocol
|
159
|
+
s = [1, 2, 3, 4, 5].create_stream
|
160
|
+
assert(s.include?(2))
|
161
|
+
assert_equal(3,s.detect {|x| x > 2})
|
162
|
+
assert_equal(nil,s.detect {|x| x < 0})
|
163
|
+
assert_equal([1,2],s.find_all {|x| x < 3})
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_modified_stream
|
167
|
+
a = [1,2,3]
|
168
|
+
assert_equal([2,3],a.create_stream.remove_first.to_a)
|
169
|
+
assert_equal([1,2],a.create_stream.remove_last.to_a)
|
170
|
+
assert_raises(Stream::EndOfStreamException) {
|
171
|
+
[1].create_stream.remove_last.forward
|
172
|
+
}
|
173
|
+
assert_raises(Stream::EndOfStreamException) {
|
174
|
+
[1].create_stream.remove_first.forward
|
175
|
+
}
|
176
|
+
end
|
177
|
+
end
|
metadata
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stream
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.5"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Horst Duchene
|
8
|
+
autorequire: stream
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-24 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: " Module Stream defines an interface for external iterators.\n"
|
17
|
+
email: hd.at.clr@hduchene.de
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- install.rb
|
26
|
+
- Rakefile
|
27
|
+
- README
|
28
|
+
- lib/generator2stream.rb
|
29
|
+
- lib/stream.rb
|
30
|
+
- test/bm.rb
|
31
|
+
- test/testgenerator.rb
|
32
|
+
- test/teststream.rb
|
33
|
+
- examples/examples.rb
|
34
|
+
- examples/streamtester.rb
|
35
|
+
has_rdoc: true
|
36
|
+
homepage: http://rgl.rubyforge.org
|
37
|
+
licenses: []
|
38
|
+
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
rubyforge_project: rgl
|
59
|
+
rubygems_version: 1.3.5
|
60
|
+
signing_key:
|
61
|
+
specification_version: 3
|
62
|
+
summary: Stream - Extended External Iterators
|
63
|
+
test_files: []
|
64
|
+
|