stream 0.5.2 → 0.5.3
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.
- checksums.yaml +4 -4
- data/Gemfile +0 -2
- data/Gemfile.lock +5 -2
- data/LICENSE +56 -0
- data/README.rdoc +1 -1
- data/Rakefile +2 -2
- data/lib/stream.rb +474 -303
- data/test/test_helper.rb +0 -3
- data/test/teststream.rb +111 -101
- metadata +22 -10
- data/lib/generator2stream.rb +0 -22
- data/test/bm.rb +0 -49
- data/test/testgenerator.rb +0 -24
data/test/test_helper.rb
CHANGED
data/test/teststream.rb
CHANGED
@@ -2,85 +2,89 @@ require 'test/unit'
|
|
2
2
|
require 'stream'
|
3
3
|
|
4
4
|
module StreamExamples
|
5
|
-
def new_collection_stream
|
5
|
+
def new_collection_stream
|
6
|
+
(1..5).create_stream;
|
7
|
+
end
|
6
8
|
|
7
9
|
# a stream which is aquivalent to new_collection_stream
|
8
10
|
def new_implicit_stream
|
9
|
-
|
10
|
-
|
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 }
|
11
|
+
Stream::ImplicitStream.new { |s|
|
12
|
+
x = 0
|
13
|
+
s.at_beginning_proc = proc { x < 1 }
|
14
|
+
s.at_end_proc = proc { x == 5 }
|
15
|
+
s.forward_proc = proc { x += 1 }
|
16
|
+
s.backward_proc = proc { y = x; x -= 1; y }
|
17
|
+
s.set_to_begin_proc = proc { x = 0 }
|
18
|
+
s.set_to_end_proc = proc { x = 5 }
|
15
19
|
}
|
16
20
|
end
|
17
21
|
|
18
22
|
def filtered_streams
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
[
|
24
|
+
new_collection_stream.filtered { |x| true },
|
25
|
+
new_collection_stream.filtered { |x| false },
|
26
|
+
new_collection_stream.filtered { |x| x > 3 },
|
27
|
+
new_collection_stream.filtered { |x| x % 2 == 0 },
|
28
|
+
new_collection_stream.filtered { |x| x % 2 == 0 }.filtered { |x| x > 3 }
|
29
|
+
]
|
26
30
|
end
|
27
31
|
|
28
32
|
def new_concatenated_stream
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
[1, 2, 3].create_stream.concatenate_collected { |i|
|
34
|
+
[i, -i].create_stream
|
35
|
+
}
|
32
36
|
end
|
33
37
|
|
34
38
|
def all_examples
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
39
|
+
[
|
40
|
+
new_collection_stream,
|
41
|
+
new_implicit_stream,
|
42
|
+
new_collection_stream.remove_first,
|
43
|
+
new_collection_stream.remove_last,
|
44
|
+
new_collection_stream.remove_first.remove_last,
|
45
|
+
Stream::WrappedStream.new(new_collection_stream),
|
46
|
+
Stream::IntervalStream.new(6),
|
47
|
+
Stream::IntervalStream.new(1),
|
48
|
+
new_collection_stream.collect { |x| x * 2 },
|
49
|
+
|
50
|
+
# Some concatenated streams
|
51
|
+
Stream::EmptyStream.instance.concatenate,
|
52
|
+
new_concatenated_stream,
|
53
|
+
# concatenated inside concatenated
|
54
|
+
new_concatenated_stream + new_concatenated_stream,
|
55
|
+
new_collection_stream + Stream::EmptyStream.instance,
|
56
|
+
Stream::EmptyStream.instance + new_collection_stream
|
57
|
+
].concat(filtered_streams)
|
54
58
|
end
|
55
59
|
|
56
60
|
private
|
57
61
|
|
58
62
|
def standard_tests_for(s)
|
59
|
-
|
60
|
-
assert_equal(s.to_a,
|
63
|
+
array_stream = s.to_a.create_stream # A collection stream that should be OK
|
64
|
+
assert_equal(s.to_a, array_stream.to_a)
|
61
65
|
# Tests at end of stream
|
62
|
-
assert_equal(s.at_end?,
|
63
|
-
assert_raises(Stream::EndOfStreamException) {s.forward}
|
64
|
-
assert_equal(s.at_beginning?,
|
65
|
-
assert_equal(s.peek,s)
|
66
|
-
unless
|
67
|
-
assert_equal(
|
68
|
-
assert_equal(
|
66
|
+
assert_equal(s.at_end?, array_stream.at_end?)
|
67
|
+
assert_raises(Stream::EndOfStreamException) { s.forward }
|
68
|
+
assert_equal(s.at_beginning?, array_stream.at_beginning?)
|
69
|
+
assert_equal(s.peek, s)
|
70
|
+
unless array_stream.at_beginning?
|
71
|
+
assert_equal(array_stream.current, s.current)
|
72
|
+
assert_equal(array_stream.backward, s.backward)
|
69
73
|
end
|
70
|
-
assert_equal(
|
71
|
-
|
74
|
+
assert_equal(array_stream.at_end?, s.at_end?)
|
75
|
+
|
72
76
|
# Tests at begin of stream
|
73
|
-
s.set_to_begin;
|
74
|
-
assert_raises(Stream::EndOfStreamException) {s.backward}
|
75
|
-
assert_equal(s.at_beginning?,
|
76
|
-
assert_equal(s.at_end?,
|
77
|
-
assert_equal(s.current,s)
|
78
|
-
unless
|
79
|
-
assert_equal(s.peek,
|
80
|
-
assert_equal(s.forward,
|
81
|
-
assert_equal(s.current,
|
82
|
-
unless
|
83
|
-
assert_equal(s.peek,
|
77
|
+
s.set_to_begin; array_stream.set_to_begin
|
78
|
+
assert_raises(Stream::EndOfStreamException) { s.backward }
|
79
|
+
assert_equal(s.at_beginning?, array_stream.at_beginning?)
|
80
|
+
assert_equal(s.at_end?, array_stream.at_end?)
|
81
|
+
assert_equal(s.current, s)
|
82
|
+
unless array_stream.at_end?
|
83
|
+
assert_equal(s.peek, array_stream.peek)
|
84
|
+
assert_equal(s.forward, array_stream.forward)
|
85
|
+
assert_equal(s.current, array_stream.current)
|
86
|
+
unless array_stream.at_end?
|
87
|
+
assert_equal(s.peek, array_stream.peek)
|
84
88
|
end
|
85
89
|
end
|
86
90
|
end
|
@@ -92,15 +96,15 @@ class TestStream < Test::Unit::TestCase
|
|
92
96
|
|
93
97
|
def test_enumerable
|
94
98
|
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
|
99
|
+
assert_equal([2, 4, 6, 8, 10], s.collect { |x| x * 2 }.entries)
|
100
|
+
assert_equal([2, 4], s.select { |x| x[0] == 0 }) # even numbers
|
97
101
|
end
|
98
102
|
|
99
103
|
def test_collection_stream
|
100
104
|
s = new_collection_stream
|
101
105
|
assert_equal([1, 2, 3, 4, 5], s.entries)
|
102
106
|
assert(s.at_end?)
|
103
|
-
|
107
|
+
assert_raises(Stream::EndOfStreamException) { s.forward }
|
104
108
|
assert_equal(5, s.backward)
|
105
109
|
assert_equal(5, s.forward)
|
106
110
|
assert_equal(5, s.current)
|
@@ -108,70 +112,76 @@ class TestStream < Test::Unit::TestCase
|
|
108
112
|
|
109
113
|
s.set_to_begin
|
110
114
|
assert(s.at_beginning?)
|
111
|
-
|
115
|
+
assert_raises(Stream::EndOfStreamException) { s.backward }
|
112
116
|
assert_equal(s, s.current)
|
113
117
|
assert_equal(1, s.peek)
|
114
118
|
assert_equal(1, s.forward)
|
115
119
|
assert_equal(1, s.current)
|
116
120
|
assert_equal(2, s.peek)
|
117
121
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
+
# move_forward_until
|
123
|
+
assert_equal(4, s.move_forward_until { |x| x > 3 })
|
124
|
+
assert_equal(nil, s.move_forward_until { |x| x < 3 })
|
125
|
+
assert(s.at_end?)
|
122
126
|
|
123
|
-
|
124
|
-
|
127
|
+
s.set_to_begin
|
128
|
+
assert_equal(nil, s.move_forward_until { |x| x > 6 })
|
125
129
|
end
|
126
130
|
|
127
131
|
def test_standard_for_examples
|
128
|
-
|
129
|
-
|
130
|
-
|
132
|
+
all_examples.each do |example_stream|
|
133
|
+
standard_tests_for(example_stream)
|
134
|
+
end
|
131
135
|
end
|
132
136
|
|
133
137
|
def test_for_examples_reversed
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
138
|
+
all_examples.each do |example_stream|
|
139
|
+
assert_equal(example_stream.entries.reverse, example_stream.reverse.entries)
|
140
|
+
assert_equal(example_stream.entries, example_stream.reverse.reverse.entries)
|
141
|
+
standard_tests_for(example_stream.reverse)
|
142
|
+
standard_tests_for(example_stream.reverse.reverse)
|
143
|
+
end
|
140
144
|
end
|
141
145
|
|
142
146
|
def test_filtered_stream
|
143
|
-
[(1..6).create_stream.filtered {|x| x % 2 == 0 }].each do |s|
|
144
|
-
|
145
|
-
|
147
|
+
[(1..6).create_stream.filtered { |x| x % 2 == 0 }].each do |s|
|
148
|
+
standard_tests_for(s)
|
149
|
+
end
|
146
150
|
end
|
147
151
|
|
148
152
|
def test_interval_stream
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
153
|
+
s = Stream::IntervalStream.new 6
|
154
|
+
standard_tests_for(s)
|
155
|
+
assert_equal([0, 1, 2, 3, 4, 5], s.entries)
|
156
|
+
s.increment_stop
|
157
|
+
assert(!s.at_end?)
|
158
|
+
assert_equal([0, 1, 2, 3, 4, 5, 6], s.entries)
|
159
|
+
standard_tests_for(s)
|
156
160
|
end
|
157
161
|
|
158
162
|
def test_enumerable_protocol
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
163
|
+
s = [1, 2, 3, 4, 5].create_stream
|
164
|
+
assert(s.include?(2))
|
165
|
+
assert_equal(3, s.detect { |x| x > 2 })
|
166
|
+
assert_equal(nil, s.detect { |x| x < 0 })
|
167
|
+
assert_equal([1, 2], s.find_all { |x| x < 3 })
|
164
168
|
end
|
165
169
|
|
166
170
|
def test_modified_stream
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
171
|
+
a = [1, 2, 3]
|
172
|
+
assert_equal([2, 3], a.create_stream.remove_first.to_a)
|
173
|
+
assert_equal([1, 2], a.create_stream.remove_last.to_a)
|
174
|
+
assert_raises(Stream::EndOfStreamException) {
|
175
|
+
[1].create_stream.remove_last.forward
|
176
|
+
}
|
177
|
+
assert_raises(Stream::EndOfStreamException) {
|
178
|
+
[1].create_stream.remove_first.forward
|
179
|
+
}
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_concatenated_empty_stream
|
183
|
+
s = Stream::EmptyStream.instance + Stream::EmptyStream.instance
|
184
|
+
assert s.at_end?
|
185
|
+
assert s.at_beginning?
|
176
186
|
end
|
177
187
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Horst Duchene
|
8
8
|
autorequire: stream
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: generator
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rake
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,20 +89,19 @@ extra_rdoc_files:
|
|
75
89
|
files:
|
76
90
|
- Gemfile
|
77
91
|
- Gemfile.lock
|
92
|
+
- LICENSE
|
78
93
|
- README.rdoc
|
79
94
|
- Rakefile
|
80
95
|
- examples/examples.rb
|
81
96
|
- examples/streamtester.rb
|
82
|
-
- lib/generator2stream.rb
|
83
97
|
- lib/stream.rb
|
84
|
-
- test/bm.rb
|
85
98
|
- test/test_helper.rb
|
86
|
-
- test/testgenerator.rb
|
87
99
|
- test/teststream.rb
|
88
100
|
homepage: https://github.com/monora/stream
|
89
|
-
licenses:
|
101
|
+
licenses:
|
102
|
+
- ruby
|
90
103
|
metadata: {}
|
91
|
-
post_install_message:
|
104
|
+
post_install_message:
|
92
105
|
rdoc_options:
|
93
106
|
- "--title"
|
94
107
|
- stream - Extended External Iterators
|
@@ -108,9 +121,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
121
|
- !ruby/object:Gem::Version
|
109
122
|
version: '0'
|
110
123
|
requirements: []
|
111
|
-
|
112
|
-
|
113
|
-
signing_key:
|
124
|
+
rubygems_version: 3.0.6
|
125
|
+
signing_key:
|
114
126
|
specification_version: 4
|
115
127
|
summary: stream - Extended External Iterators
|
116
128
|
test_files: []
|
data/lib/generator2stream.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# Let a Generator look like a Stream.
|
2
|
-
require 'stream'
|
3
|
-
require 'generator'
|
4
|
-
|
5
|
-
# The generator is made a Stream by aliasing
|
6
|
-
# the methods at_end?, basic_forward, basic_peek, set_to_begin to the approriate
|
7
|
-
# methods #end?, #next, #peek and #rewind of the Generator class.
|
8
|
-
#
|
9
|
-
# Be careful if you already use a version of Akinori MUSHAs generator.rb. Check out
|
10
|
-
# the version numbers of the one you use and the one comming with the stream package.
|
11
|
-
class Generator
|
12
|
-
include Stream
|
13
|
-
|
14
|
-
alias_method :at_end?, :end?
|
15
|
-
alias_method :basic_forward, :next
|
16
|
-
alias_method :basic_peek, :peek
|
17
|
-
alias_method :set_to_begin, :rewind
|
18
|
-
|
19
|
-
# Returns the generator itself.
|
20
|
-
def create_stream; self; end
|
21
|
-
end
|
22
|
-
|
data/test/bm.rb
DELETED
@@ -1,49 +0,0 @@
|
|
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
|
data/test/testgenerator.rb
DELETED
@@ -1,24 +0,0 @@
|
|
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
|