stream 0.5.4 → 0.5.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +12 -8
- data/README.rdoc +67 -59
- data/lib/stream.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01b456afc318137cc9291dd8f7ec664dcc6370225c1fb8cf0a223794d1a18cb7
|
4
|
+
data.tar.gz: 19824c0406a4e7b253aa682db312f89fea8a1d0c9bd3a3513d2951ffdc3126b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3fdb6526fabfd8ff52d8ea5b195f83a5644515f99444ab589d389ffb08365dea6de40e69e84bd8c9c93155cabcee3fe0a0e2ef0dd1a96403a7dc2035bf80be2
|
7
|
+
data.tar.gz: 95c2179dca08a24eb24f7aa811be95b4bd1c17ea57e41d218ada55783933cdac30eb958ca61a42294bc719097d98327fe846248bf7f88b47272776fbfcddff07
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
stream (0.5.
|
5
|
-
generator
|
4
|
+
stream (0.5.5)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
9
8
|
specs:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
power_assert (2.0.1)
|
10
|
+
psych (4.0.4)
|
11
|
+
stringio
|
12
|
+
rake (13.0.6)
|
13
|
+
rdoc (6.4.0)
|
14
|
+
psych (>= 4.0.0)
|
15
|
+
stringio (3.0.2)
|
16
|
+
test-unit (3.5.3)
|
15
17
|
power_assert
|
16
|
-
|
18
|
+
webrick (1.7.0)
|
19
|
+
yard (0.9.28)
|
20
|
+
webrick (~> 1.7.0)
|
17
21
|
|
18
22
|
PLATFORMS
|
19
23
|
ruby
|
data/README.rdoc
CHANGED
@@ -4,8 +4,9 @@
|
|
4
4
|
|
5
5
|
== Description
|
6
6
|
|
7
|
-
Module Stream defines an interface for external
|
8
|
-
|
7
|
+
Module +Stream+ defines an interface for {external
|
8
|
+
iterators}[https://wiki.c2.com/?ExternalIterator]. A stream can be seen
|
9
|
+
as an iterator on a sequence of objects +x1,...,xn+. The state of the
|
9
10
|
stream is uniquely determined by the following methods:
|
10
11
|
|
11
12
|
* at_beginning?
|
@@ -20,14 +21,15 @@ State changes are done with the following operations:
|
|
20
21
|
* forward
|
21
22
|
* backward
|
22
23
|
|
23
|
-
With the help of the method current_edge the state of a stream s can be
|
24
|
+
With the help of the method +current_edge+ the state of a stream +s+ can be
|
24
25
|
exactly defined
|
25
26
|
|
26
27
|
s.current_edge == [s.current, s.peek]
|
27
28
|
|
28
|
-
If s a stream on [x1,...,xn]. Consider the edges [xi,xi+1] i=1,...,n
|
29
|
-
[x0,x1] and [xn,xn+1] (x0 and xn+1 are helper elements to define
|
30
|
-
conditions). Then if s is non empty, the following
|
29
|
+
If +s+ a stream on [x1,...,xn]. Consider the edges [xi,xi+1] i=1,...,n
|
30
|
+
and [x0,x1] and [xn,xn+1] (x0 and xn+1 are helper elements to define
|
31
|
+
the boundary conditions). Then if +s+ is non empty, the following
|
32
|
+
conditions must be true:
|
31
33
|
|
32
34
|
s.at_beginning? <=> s.current_edge == [x0,x1]
|
33
35
|
s.at_end? <=> s.current_edge == [xn,xn+1]
|
@@ -46,16 +48,18 @@ If 1 <= i < n and s.current_edge == [xi, xi+1] , then:
|
|
46
48
|
The result of peek is the same as of forward without changing state. The result of
|
47
49
|
current is the same as of backward without changing state.
|
48
50
|
|
49
|
-
Module Stream includes Enumerable implementing
|
51
|
+
Module +Stream+ includes +Enumerable+ implementing +each+ in the obvious way.
|
50
52
|
|
51
|
-
Not every stream needs to implement
|
52
|
-
not reversable. If they are reversable peek can easily be
|
53
|
-
forward and backward
|
54
|
-
reversable all derived streams provided
|
55
|
-
mapping, concatenation) can be used
|
56
|
-
current) uses of backward
|
53
|
+
Not every stream needs to implement +backward+ and +at_beginning?+
|
54
|
+
thus being not reversable. If they are reversable peek can easily be
|
55
|
+
implemented using +forward+ and +backward+, as is done in module
|
56
|
+
+Stream+. If a stream is not reversable all derived streams provided
|
57
|
+
by the stream module (filter, mapping, concatenation) can be used
|
58
|
+
anyway. Explicit or implicit (via peek or current) uses of backward
|
59
|
+
would throw a +NotImplementedError+.
|
57
60
|
|
58
|
-
Classes implementing the stream interface must implement the following
|
61
|
+
Classes implementing the stream interface must implement the following
|
62
|
+
methods:
|
59
63
|
|
60
64
|
* basic_forward
|
61
65
|
* basic_backward
|
@@ -63,60 +67,40 @@ Classes implementing the stream interface must implement the following methods:
|
|
63
67
|
* at_end?
|
64
68
|
* at_beginning?
|
65
69
|
|
66
|
-
The methods set_to_end and set_to_begin are by default implemented
|
70
|
+
The methods +set_to_end+ and +set_to_begin+ are by default implemented
|
71
|
+
as:
|
67
72
|
|
68
73
|
set_to_end : until at_end?; do basic_forward end
|
69
74
|
set_to_begin : until at_beginning?; do basic_backward end
|
70
75
|
|
71
|
-
The methods forward and backward are by default implemented as:
|
76
|
+
The methods +forward+ and +backward+ are by default implemented as:
|
72
77
|
|
73
|
-
forward:
|
74
|
-
backward:
|
78
|
+
forward: raise EndOfStreamException if at_end?; basic_forward.
|
79
|
+
backward: raise EndOfStreamException if at_beginning?; basic_backward
|
75
80
|
|
76
81
|
Thus subclasses must only implement *four* methods. Efficiency sometimes
|
77
82
|
demands better implementations.
|
78
83
|
|
79
84
|
There are several concrete classes implementing the stream interface:
|
80
85
|
|
81
|
-
* Stream::EmptyStream (boring)
|
82
|
-
* Stream::CollectionStream created by the method Array#create_stream
|
83
|
-
* Stream::FilteredStream created by the method Stream#filtered
|
84
|
-
* Stream::ReversedStream created by the method Stream#reverse
|
85
|
-
* Stream::ConcatenatedStream created by the method Stream#concatenate
|
86
|
-
* Stream::ImplicitStream using closures for the basic methods to implement
|
87
|
-
|
88
|
-
== Download
|
89
|
-
|
90
|
-
The latest version of stream.rb can be found at
|
91
|
-
|
92
|
-
* http://github.com/monora/stream
|
86
|
+
* +Stream::EmptyStream+ (boring)
|
87
|
+
* +Stream::CollectionStream+ created by the method +Array#create_stream+
|
88
|
+
* +Stream::FilteredStream+ created by the method +Stream#filtered+
|
89
|
+
* +Stream::ReversedStream+ created by the method +Stream#reverse+
|
90
|
+
* +Stream::ConcatenatedStream+ created by the method +Stream#concatenate+
|
91
|
+
* +Stream::ImplicitStream+ using closures for the basic methods to implement
|
93
92
|
|
94
93
|
== Installation
|
95
94
|
|
96
|
-
|
97
|
-
|
98
|
-
You can install stream with the following command.
|
99
|
-
|
100
|
-
% ruby install.rb
|
101
|
-
|
102
|
-
from its distribution directory.
|
103
|
-
|
104
|
-
=== GEM Installation
|
105
|
-
|
106
|
-
Download the GEM file and install it with ..
|
107
|
-
|
108
|
-
gem -i stream-VERSION.gem
|
109
|
-
|
110
|
-
Use the correct version number for VERSION (e.g. 0.5). You may need
|
111
|
-
root privileges to install.
|
95
|
+
gem install stream
|
112
96
|
|
113
|
-
|
114
|
-
|
115
|
-
* Streams in Smalltalk: http://wiki.cs.uiuc.edu/PatternStories/FunWithStreams
|
116
|
-
* Simon Strandgaards iterator.rb[http://aeditor.rubyforge.org/iterator/files/iterator_rb.html]
|
97
|
+
or download the latest sources from the git repository
|
98
|
+
https://github.com/monora/stream.
|
117
99
|
|
118
100
|
== Examples
|
119
101
|
|
102
|
+
=== Iterate over three streams
|
103
|
+
|
120
104
|
g = ('a'..'f').create_stream
|
121
105
|
h = (1..10).create_stream
|
122
106
|
i = (10..20).create_stream
|
@@ -125,6 +109,17 @@ root privileges to install.
|
|
125
109
|
p [g.forward, h.forward, i.forward]
|
126
110
|
end
|
127
111
|
|
112
|
+
Output:
|
113
|
+
|
114
|
+
["a", 1, 10]
|
115
|
+
["b", 2, 11]
|
116
|
+
["c", 3, 12]
|
117
|
+
["d", 4, 13]
|
118
|
+
["e", 5, 14]
|
119
|
+
["f", 6, 15]
|
120
|
+
|
121
|
+
=== Concatenate file streams
|
122
|
+
|
128
123
|
def filestream fname
|
129
124
|
Stream::ImplicitStream.new { |s|
|
130
125
|
f = open(fname)
|
@@ -138,7 +133,7 @@ root privileges to install.
|
|
138
133
|
puts l
|
139
134
|
end
|
140
135
|
|
141
|
-
|
136
|
+
=== Two filtered collection streams concatenated and reversed
|
142
137
|
|
143
138
|
def newstream; (1..6).create_stream; end
|
144
139
|
s = newstream.filtered { |x| x % 2 == 0 } + newstream.filtered { |x| x % 2 != 0 }
|
@@ -150,9 +145,21 @@ root privileges to install.
|
|
150
145
|
puts "Forward : #{s.forward}"
|
151
146
|
puts "Peek : #{s.peek}"
|
152
147
|
puts "Current : #{s.current}"
|
153
|
-
puts "set_to_begin
|
148
|
+
puts "set_to_begin : Peek=#{s.set_to_begin;s.peek}"
|
149
|
+
|
150
|
+
Output:
|
151
|
+
|
152
|
+
Contents : 5 3 1 6 4 2
|
153
|
+
At end? : true
|
154
|
+
At beginning? : false
|
155
|
+
2xBackwards : 2 4
|
156
|
+
Forward : 4
|
157
|
+
Peek : 2
|
158
|
+
Current : 4
|
159
|
+
set_to_begin : Peek=5
|
160
|
+
|
161
|
+
=== An infinite stream (do not use +set_to_end+!)
|
154
162
|
|
155
|
-
# an infinite stream (do not use set_to_end!)
|
156
163
|
def randomStream
|
157
164
|
Stream::ImplicitStream.new { |s|
|
158
165
|
s.set_to_begin_proc = proc {srand 1234}
|
@@ -160,13 +167,14 @@ root privileges to install.
|
|
160
167
|
s.forward_proc = proc {rand}
|
161
168
|
}
|
162
169
|
end
|
163
|
-
s = randomStream.filtered { |x| x >= 0.5 }.collect { |x| sprintf("%5.2f
|
164
|
-
puts "5 random numbers: #{(1..5).collect {|x| s.forward}}\n"
|
170
|
+
s = randomStream.filtered { |x| x >= 0.5 }.collect { |x| sprintf("%5.2f",x*100) }
|
171
|
+
puts "5 random numbers: #{(1..5).collect {|x| s.forward}}\n"
|
172
|
+
|
173
|
+
Output:
|
165
174
|
|
166
|
-
|
175
|
+
5 random numbers: ["62.21", "78.54", "78.00", "80.19", "95.81"]
|
167
176
|
|
168
|
-
==
|
177
|
+
== License
|
169
178
|
|
170
179
|
Author:: Horst Duchene
|
171
|
-
License:: Copyright (c) 2001, 2013, 2016, 2020 Horst Duchene
|
172
|
-
Released under the same license as Ruby
|
180
|
+
License:: Copyright (c) 2001, 2013, 2016, 2020, 2022 Horst Duchene (Released under the same license as Ruby (see LICENSE))
|
data/lib/stream.rb
CHANGED
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
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.5
|
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: 2022-
|
11
|
+
date: 2022-08-29 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'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rake
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|