stream 0.5 → 0.5.2
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 +7 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +37 -0
- data/{README → README.rdoc} +6 -8
- data/Rakefile +23 -134
- data/lib/stream.rb +335 -323
- data/test/test_helper.rb +5 -0
- metadata +94 -42
- data/install.rb +0 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3374a923bc2d44c39ea1c1957d5982b26f55a22ac958cfa119be87a978e17676
|
4
|
+
data.tar.gz: 88b9b768b08a6edf3a689f76f50627784825b15ac1ed07d6b3172bb34ce69fa3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fd0f115fefc0969ccde444c8200d9f279b8d9736af6c91884d89e5fa9dd4a46dccb6b570da4467b7dfaa35e038644b09dbf25348289a66cf0ea919c4c21c732b
|
7
|
+
data.tar.gz: 56d49b892e3355026bb05bd98535471ebfe9e8564f9f1885e43938deda8b7f3e33551fcd15f1b492821944de5707ef296dff3f134812b1f8e904ce0ef8b4f037
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
stream (0.5.2)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
codeclimate-test-reporter (1.0.9)
|
10
|
+
simplecov (<= 0.13)
|
11
|
+
docile (1.1.5)
|
12
|
+
json (2.1.0)
|
13
|
+
power_assert (1.1.3)
|
14
|
+
rake (12.3.2)
|
15
|
+
rdoc (6.1.1)
|
16
|
+
simplecov (0.13.0)
|
17
|
+
docile (~> 1.1.0)
|
18
|
+
json (>= 1.8, < 3)
|
19
|
+
simplecov-html (~> 0.10.0)
|
20
|
+
simplecov-html (0.10.2)
|
21
|
+
test-unit (3.2.9)
|
22
|
+
power_assert
|
23
|
+
yard (0.9.16)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
codeclimate-test-reporter
|
30
|
+
rake
|
31
|
+
rdoc
|
32
|
+
stream!
|
33
|
+
test-unit
|
34
|
+
yard
|
35
|
+
|
36
|
+
BUNDLED WITH
|
37
|
+
2.0.1
|
data/{README → README.rdoc}
RENAMED
@@ -1,3 +1,5 @@
|
|
1
|
+
{<img src="https://secure.travis-ci.org/monora/stream.png?branch=master" alt="Build Status" />}[https://travis-ci.org/monora/stream]
|
2
|
+
|
1
3
|
= Extended External Iterators (forward and backward)
|
2
4
|
|
3
5
|
== Description
|
@@ -24,7 +26,7 @@ exactly defined
|
|
24
26
|
s.current_edge == [s.current, s.peek]
|
25
27
|
|
26
28
|
If s a stream on [x1,...,xn]. Consider the edges [xi,xi+1] i=1,...,n and
|
27
|
-
[x0,x1] and [xn,xn+1] (x0 and xn are helper elements to define the boundary
|
29
|
+
[x0,x1] and [xn,xn+1] (x0 and xn+1 are helper elements to define the boundary
|
28
30
|
conditions). Then if s is non empty, the following conditions must be true:
|
29
31
|
|
30
32
|
s.at_beginning? <=> s.current_edge == [x0,x1]
|
@@ -87,7 +89,7 @@ There are several concrete classes implementing the stream interface:
|
|
87
89
|
|
88
90
|
The latest version of stream.rb can be found at
|
89
91
|
|
90
|
-
* http://
|
92
|
+
* http://github.com/monora/stream
|
91
93
|
|
92
94
|
== Installation
|
93
95
|
|
@@ -112,7 +114,6 @@ root privileges to install.
|
|
112
114
|
|
113
115
|
* Streams in Smalltalk: http://wiki.cs.uiuc.edu/PatternStories/FunWithStreams
|
114
116
|
* Simon Strandgaards iterator.rb[http://aeditor.rubyforge.org/iterator/files/iterator_rb.html]
|
115
|
-
* IterationStyles: http://www.rubygarden.org/ruby?IterationStyles
|
116
117
|
|
117
118
|
== Examples
|
118
119
|
|
@@ -166,9 +167,6 @@ root privileges to install.
|
|
166
167
|
|
167
168
|
== Other Stuff
|
168
169
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
Author:: Horst Duchene <hd.at.clr@hduchene.de>
|
173
|
-
License:: Copyright (c) 2001, 2004 Horst Duchene
|
170
|
+
Author:: Horst Duchene
|
171
|
+
License:: Copyright (c) 2001, 2013, 2016 Horst Duchene
|
174
172
|
Released under the same license as Ruby
|
data/Rakefile
CHANGED
@@ -1,22 +1,15 @@
|
|
1
|
-
# Rakefile for
|
1
|
+
# Rakefile for stream -*- ruby -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
nil
|
7
|
-
end
|
8
|
-
require 'rake/clean'
|
9
|
-
require 'rake/testtask'
|
10
|
-
require 'rake/gempackagetask'
|
11
|
-
require 'rake/rdoctask'
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'rubygems/package_task'
|
12
6
|
|
13
|
-
|
7
|
+
require 'rake/testtask'
|
8
|
+
require 'rake/clean'
|
9
|
+
require 'yard'
|
14
10
|
|
15
|
-
|
16
|
-
|
17
|
-
else
|
18
|
-
PKG_VERSION = "0.0.0"
|
19
|
-
end
|
11
|
+
$:.unshift File.join(File.dirname(__FILE__), 'lib')
|
12
|
+
require 'stream' # require module to STREAM_VERSION
|
20
13
|
|
21
14
|
SRC_RB = FileList['lib/*.rb']
|
22
15
|
|
@@ -27,11 +20,11 @@ task :default => :test
|
|
27
20
|
|
28
21
|
# Define a test task.
|
29
22
|
|
30
|
-
Rake::TestTask.new
|
31
|
-
|
32
|
-
|
23
|
+
Rake::TestTask.new do |t|
|
24
|
+
t.libs << "tests"
|
25
|
+
t.pattern = 'tests/Test*.rb'
|
33
26
|
t.verbose = true
|
34
|
-
|
27
|
+
end
|
35
28
|
|
36
29
|
task :test
|
37
30
|
|
@@ -39,123 +32,19 @@ task :test
|
|
39
32
|
desc "Run all test targets"
|
40
33
|
task :testall => [:test ]
|
41
34
|
|
42
|
-
#
|
35
|
+
# Git tagging
|
43
36
|
|
44
|
-
desc "
|
45
|
-
task :
|
46
|
-
|
37
|
+
desc "Commit all changes as a new version commit. Tag the commit with v<version> tag"
|
38
|
+
task :tag do
|
39
|
+
puts "Committing and tagging version #{STREAM_VERSION}"
|
40
|
+
`git commit -am 'Version #{STREAM_VERSION}'`
|
41
|
+
`git tag 'v#{STREAM_VERSION}'`
|
47
42
|
end
|
48
43
|
|
49
|
-
#
|
50
|
-
|
51
|
-
rd = Rake::RDocTask.new("rdoc") { |rdoc|
|
52
|
-
rdoc.rdoc_dir = 'html'
|
53
|
-
# rdoc.template = 'kilmer'
|
54
|
-
# rdoc.template = 'css2'
|
55
|
-
rdoc.title = "Stream - Extended External Iterators"
|
56
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
57
|
-
rdoc.rdoc_files.include('README')
|
58
|
-
rdoc.rdoc_files.include('lib/*.rb', 'doc/**/*.rdoc')
|
59
|
-
}
|
60
|
-
|
61
|
-
# ====================================================================
|
62
|
-
# Create a task that will package the stream software into distributable
|
63
|
-
# tar, zip and gem files.
|
64
|
-
|
65
|
-
PKG_FILES = FileList[
|
66
|
-
'install.rb',
|
67
|
-
'[A-Z]*',
|
68
|
-
'lib/**/*.rb',
|
69
|
-
'test/**/*.rb',
|
70
|
-
'examples/**/*'
|
71
|
-
]
|
72
|
-
|
73
|
-
if ! defined?(Gem)
|
74
|
-
puts "Package Target requires RubyGEMs"
|
75
|
-
else
|
76
|
-
spec = Gem::Specification.new do |s|
|
77
|
-
|
78
|
-
#### Basic information.
|
79
|
-
|
80
|
-
s.name = 'stream'
|
81
|
-
s.version = PKG_VERSION
|
82
|
-
s.summary = "Stream - Extended External Iterators"
|
83
|
-
s.description = <<-EOF
|
84
|
-
Module Stream defines an interface for external iterators.
|
85
|
-
EOF
|
86
|
-
|
87
|
-
#### Dependencies and requirements.
|
88
|
-
|
89
|
-
#s.add_dependency('log4r', '> 1.0.4')
|
90
|
-
#s.requirements << ""
|
91
|
-
|
92
|
-
#### Which files are to be included in this gem? Everything! (Except CVS directories.)
|
93
|
-
|
94
|
-
s.files = PKG_FILES.to_a
|
44
|
+
# Documentation
|
95
45
|
|
96
|
-
|
46
|
+
YARD::Rake::YardocTask.new
|
97
47
|
|
98
|
-
|
48
|
+
# Tasks for building and installing Stream gem.
|
99
49
|
|
100
|
-
|
101
|
-
|
102
|
-
s.require_path = 'lib' # Use these for libraries.
|
103
|
-
s.autorequire = 'stream'
|
104
|
-
|
105
|
-
#### Documentation and testing.
|
106
|
-
|
107
|
-
s.has_rdoc = true
|
108
|
-
#s.test_suite_file = "test/rmagic-tests.rb"
|
109
|
-
|
110
|
-
#### Author and project details.
|
111
|
-
s.author = "Horst Duchene"
|
112
|
-
s.email = "hd.at.clr@hduchene.de"
|
113
|
-
s.homepage = "http://rgl.rubyforge.org"
|
114
|
-
s.rubyforge_project = "rgl"
|
115
|
-
end
|
116
|
-
|
117
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
118
|
-
pkg.need_zip = true
|
119
|
-
pkg.need_tar = true
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# Misc tasks =========================================================
|
124
|
-
|
125
|
-
def count_lines(filename)
|
126
|
-
lines = 0
|
127
|
-
codelines = 0
|
128
|
-
open(filename) { |f|
|
129
|
-
f.each do |line|
|
130
|
-
lines += 1
|
131
|
-
next if line =~ /^\s*$/
|
132
|
-
next if line =~ /^\s*#/
|
133
|
-
codelines += 1
|
134
|
-
end
|
135
|
-
}
|
136
|
-
[lines, codelines]
|
137
|
-
end
|
138
|
-
|
139
|
-
def show_line(msg, lines, loc)
|
140
|
-
printf "%6s %6s %s\n", lines.to_s, loc.to_s, msg
|
141
|
-
end
|
142
|
-
|
143
|
-
desc "Count lines in the main files"
|
144
|
-
task :lines do
|
145
|
-
total_lines = 0
|
146
|
-
total_code = 0
|
147
|
-
show_line("File Name", "LINES", "LOC")
|
148
|
-
SRC_RB.each do |fn|
|
149
|
-
lines, codelines = count_lines(fn)
|
150
|
-
show_line(fn, lines, codelines)
|
151
|
-
total_lines += lines
|
152
|
-
total_code += codelines
|
153
|
-
end
|
154
|
-
show_line("TOTAL", total_lines, total_code)
|
155
|
-
end
|
156
|
-
|
157
|
-
ARCHIVEDIR = '/mnt/flash'
|
158
|
-
|
159
|
-
task :archive => [:package] do
|
160
|
-
cp FileList["pkg/*.tgz", "pkg/*.zip", "pkg/*.gem"], ARCHIVEDIR
|
161
|
-
end
|
50
|
+
Bundler::GemHelper.install_tasks
|
data/lib/stream.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
STREAM_VERSION = "0.5"
|
1
|
+
STREAM_VERSION = "0.5.2"
|
2
2
|
|
3
3
|
##
|
4
4
|
# Module Stream defines an interface for an external Iterator which
|
@@ -62,25 +62,25 @@ module Stream
|
|
62
62
|
# current position. #detect, which is inherited from Enumerable uses
|
63
63
|
# #each, which implicitly calls #set_to_begin.
|
64
64
|
def move_forward_until
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
65
|
+
until at_end?
|
66
|
+
element = basic_forward
|
67
|
+
return element if yield(element)
|
68
|
+
end
|
69
|
+
nil
|
70
70
|
end
|
71
71
|
|
72
72
|
# Move backward until the boolean block is not false and returns the element
|
73
73
|
# found. Returns nil if no object matches.
|
74
74
|
def move_backward_until
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
until at_beginning?
|
76
|
+
element = basic_backward
|
77
|
+
return element if yield(element)
|
78
|
+
end
|
79
|
+
nil
|
80
80
|
end
|
81
|
-
|
82
|
-
# Returns the element returned by the last call of #forward. If at_beginning?
|
83
|
-
# true self is returned.
|
81
|
+
|
82
|
+
# Returns the element returned by the last call of #forward. If at_beginning?
|
83
|
+
# is true self is returned.
|
84
84
|
def current; at_beginning? ? self : basic_current; end
|
85
85
|
|
86
86
|
# Returns the element returned by the last call of #backward. If at_end? is
|
@@ -110,9 +110,9 @@ module Stream
|
|
110
110
|
yield basic_forward
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
114
|
-
# create_stream is used for each Enumerable to create a stream for it. A
|
115
|
-
# an Enumerable returns itself.
|
113
|
+
|
114
|
+
# create_stream is used for each Enumerable to create a stream for it. A
|
115
|
+
# Stream as an Enumerable returns itself.
|
116
116
|
def create_stream; self end
|
117
117
|
|
118
118
|
# A Stream::WrappedStream should return the wrapped stream unwrapped. If the
|
@@ -122,80 +122,83 @@ module Stream
|
|
122
122
|
# The abstract super class of all concrete Classes implementing the Stream
|
123
123
|
# interface. Only used for including module Stream.
|
124
124
|
class BasicStream
|
125
|
-
|
125
|
+
include Stream
|
126
126
|
end
|
127
127
|
|
128
|
-
# A Singleton class for an empty stream. EmptyStream.instance is the sole
|
129
|
-
# which answers true for both at_end? and at_beginning?
|
128
|
+
# A Singleton class for an empty stream. EmptyStream.instance is the sole
|
129
|
+
# instance which answers true for both at_end? and at_beginning?
|
130
130
|
class EmptyStream < BasicStream
|
131
|
-
|
132
|
-
|
131
|
+
require 'singleton'
|
132
|
+
include Singleton
|
133
133
|
|
134
|
-
|
135
|
-
|
134
|
+
def at_end?; true; end
|
135
|
+
def at_beginning?; true; end
|
136
136
|
end
|
137
137
|
|
138
|
-
# A CollectionStream can be used as an external iterator for each
|
139
|
-
# collection. The state of the iterator is stored in instance
|
138
|
+
# A CollectionStream can be used as an external iterator for each
|
139
|
+
# interger-indexed collection. The state of the iterator is stored in instance
|
140
|
+
# variable @pos.
|
140
141
|
#
|
141
|
-
# A CollectionStream for an array is created by the method
|
142
|
+
# A CollectionStream for an array is created by the method
|
143
|
+
# Array#create_stream.
|
142
144
|
class CollectionStream < BasicStream
|
143
|
-
|
145
|
+
attr_reader :pos
|
144
146
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
147
|
+
# Creates a new CollectionStream for the indexable sequence _seq_.
|
148
|
+
def initialize(seq)
|
149
|
+
@seq = seq
|
150
|
+
set_to_begin
|
151
|
+
end
|
150
152
|
|
151
|
-
|
152
|
-
|
153
|
+
def at_end?; @pos + 1 >= @seq.size; end
|
154
|
+
def at_beginning?; @pos < 0; end
|
153
155
|
|
154
|
-
|
156
|
+
# positioning
|
155
157
|
|
156
|
-
|
157
|
-
|
158
|
-
|
158
|
+
#
|
159
|
+
def set_to_begin; @pos = -1; end
|
160
|
+
def set_to_end; @pos = @seq.size - 1; end
|
159
161
|
|
160
|
-
|
161
|
-
|
162
|
+
def basic_forward; @pos += 1; @seq[@pos]; end
|
163
|
+
def basic_backward; r = @seq[@pos]; @pos -= 1; r; end
|
162
164
|
|
163
|
-
|
165
|
+
protected
|
164
166
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
167
|
+
# basic_current and basic_peek can be implemented more efficiently than in
|
168
|
+
# superclass
|
169
|
+
def basic_current; @seq[@pos]; end
|
170
|
+
def basic_peek; @seq[@pos+1]; end
|
169
171
|
|
170
172
|
end # CollectionStream
|
171
173
|
|
172
174
|
# A simple Iterator for iterating over a sequence of integers starting from
|
173
|
-
# zero up to a given upper bound. Mainly used by Stream::FilteredStream. Could
|
174
|
-
# made private but if somebody needs it here it is. Is there a better name
|
175
|
+
# zero up to a given upper bound. Mainly used by Stream::FilteredStream. Could
|
176
|
+
# be made private but if somebody needs it here it is. Is there a better name
|
177
|
+
# for it?
|
175
178
|
#
|
176
|
-
# The upper bound is stored in the instance variable @stop which can be
|
177
|
-
# dynamically by the method increment_stop.
|
179
|
+
# The upper bound is stored in the instance variable @stop which can be
|
180
|
+
# incremented dynamically by the method increment_stop.
|
178
181
|
class IntervalStream < BasicStream
|
179
|
-
|
182
|
+
attr_reader :pos
|
180
183
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
184
|
+
# Create a new IntervalStream with upper bound _stop_. stop - 1 is the last
|
185
|
+
# element. By default _stop_ is zero which means that the stream is empty.
|
186
|
+
def initialize(stop=0)
|
187
|
+
@stop = stop - 1
|
188
|
+
set_to_begin
|
189
|
+
end
|
187
190
|
|
188
|
-
|
189
|
-
|
191
|
+
def at_beginning?; @pos < 0; end
|
192
|
+
def at_end?; @pos == @stop; end
|
190
193
|
|
191
|
-
|
192
|
-
|
194
|
+
def set_to_end; @pos = @stop; end
|
195
|
+
def set_to_begin; @pos = -1; end
|
193
196
|
|
194
|
-
|
195
|
-
|
197
|
+
# Increment the upper bound by incr.
|
198
|
+
def increment_stop(incr=1); @stop += incr; end
|
196
199
|
|
197
|
-
|
198
|
-
|
200
|
+
def basic_forward; @pos += 1; end
|
201
|
+
def basic_backward; @pos -= 1; @pos + 1; end
|
199
202
|
end
|
200
203
|
|
201
204
|
# Class WrappedStream is the abstract superclass for stream classes that wrap
|
@@ -208,25 +211,25 @@ module Stream
|
|
208
211
|
# arrayStream.to_a => [1,2,3]
|
209
212
|
# Stream::WrappedStream.new(arrayStream).to_a => [1,2,3]
|
210
213
|
class WrappedStream < BasicStream
|
211
|
-
|
214
|
+
attr_reader :wrapped_stream
|
212
215
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
216
|
+
# Create a new WrappedStream wrapping the Stream _otherStream_.
|
217
|
+
def initialize(otherStream)
|
218
|
+
@wrapped_stream = otherStream
|
219
|
+
end
|
217
220
|
|
218
|
-
|
219
|
-
|
221
|
+
def at_beginning?; @wrapped_stream.at_beginning?; end
|
222
|
+
def at_end?; @wrapped_stream.at_end?; end
|
220
223
|
|
221
|
-
|
222
|
-
|
224
|
+
def set_to_end; @wrapped_stream.set_to_end; end
|
225
|
+
def set_to_begin; @wrapped_stream.set_to_begin; end
|
223
226
|
|
224
|
-
|
225
|
-
|
227
|
+
# Returns the wrapped stream unwrapped.
|
228
|
+
def unwrapped; @wrapped_stream.unwrapped; end
|
226
229
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
+
public # but should be protected. Would like to have a friend concept here.
|
231
|
+
def basic_forward; @wrapped_stream.basic_forward; end
|
232
|
+
def basic_backward; @wrapped_stream.basic_backward; end
|
230
233
|
end
|
231
234
|
|
232
235
|
##
|
@@ -238,212 +241,215 @@ module Stream
|
|
238
241
|
# (1..6).create_stream.filtered { |x| x % 2 == 0 }.to_a ==> [2, 4, 6]
|
239
242
|
class FilteredStream < WrappedStream
|
240
243
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
244
|
+
# Create a new FilteredStream wrapping _otherStream_ and selecting all its
|
245
|
+
# elements which satisfy the condition defined by the block_filter_.
|
246
|
+
def initialize(otherStream, &filter)
|
247
|
+
super otherStream
|
248
|
+
@filter = filter
|
249
|
+
@positionHolder = IntervalStream.new
|
250
|
+
set_to_begin
|
251
|
+
end
|
252
|
+
|
253
|
+
def at_beginning?; @positionHolder.at_beginning?; end
|
254
|
+
|
255
|
+
# at_end? has to look ahead if there is an element satisfing the filter
|
256
|
+
def at_end?
|
257
|
+
@positionHolder.at_end? and
|
258
|
+
begin
|
259
|
+
if @peek.nil?
|
260
|
+
@peek = wrapped_stream.move_forward_until( &@filter ) or return true
|
261
|
+
@positionHolder.increment_stop
|
262
|
+
end
|
263
|
+
false
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def basic_forward
|
268
|
+
result =
|
269
|
+
if @peek.nil?
|
270
|
+
wrapped_stream.move_forward_until(&@filter)
|
271
|
+
else
|
272
|
+
# Do not move!!
|
273
|
+
@peek
|
274
|
+
end
|
275
|
+
@peek = nil
|
276
|
+
@positionHolder.forward
|
277
|
+
result
|
278
|
+
end
|
279
|
+
|
280
|
+
def basic_backward
|
281
|
+
wrapped_stream.backward unless @peek.nil?
|
282
|
+
@peek = nil
|
283
|
+
@positionHolder.backward
|
284
|
+
wrapped_stream.move_backward_until(&@filter) or self
|
285
|
+
end
|
286
|
+
|
287
|
+
def set_to_end
|
288
|
+
# Not super which is a WrappedStream, but same behavior as in Stream
|
289
|
+
until at_end?; basic_forward; end
|
290
|
+
end
|
291
|
+
|
292
|
+
def set_to_begin
|
293
|
+
super
|
294
|
+
@peek = nil
|
295
|
+
@positionHolder.set_to_begin
|
296
|
+
end
|
297
|
+
|
298
|
+
# Returns the current position of the stream.
|
299
|
+
def pos; @positionHolder.pos; end
|
297
300
|
end # FilteredStream
|
298
301
|
|
299
302
|
##
|
300
|
-
# Each reversable stream (a stream that implements #backward and
|
301
|
-
# be wrapped by a ReversedStream.
|
303
|
+
# Each reversable stream (a stream that implements #backward and
|
304
|
+
# at_beginning?) can be wrapped by a ReversedStream.
|
302
305
|
#
|
303
306
|
# A ReversedStream is created by the method #reverse:
|
304
307
|
#
|
305
308
|
# (1..6).create_stream.reverse.to_a ==> [6, 5, 4, 3, 2, 1]
|
306
309
|
class ReversedStream < WrappedStream
|
307
310
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
311
|
+
# Create a reversing wrapper for the reversable stream _otherStream_. If
|
312
|
+
# _otherStream_ does not support backward moving a NotImplementedError is
|
313
|
+
# signaled on the first backward move.
|
314
|
+
def initialize(otherStream)
|
315
|
+
super otherStream
|
316
|
+
set_to_begin
|
317
|
+
end
|
318
|
+
|
319
|
+
# Returns true if the wrapped stream is at_end?.
|
320
|
+
def at_beginning?; wrapped_stream.at_end?; end
|
321
|
+
# Returns true if the wrapped stream is at_beginning?.
|
322
|
+
def at_end?; wrapped_stream.at_beginning?; end
|
323
|
+
|
324
|
+
# Moves the wrapped stream one step backward.
|
325
|
+
def basic_forward; wrapped_stream.basic_backward; end
|
326
|
+
# Moves the wrapped stream one step forward.
|
327
|
+
def basic_backward; wrapped_stream.basic_forward; end
|
328
|
+
|
329
|
+
# Sets the wrapped stream to the beginning.
|
330
|
+
def set_to_end; wrapped_stream.set_to_begin; end
|
331
|
+
# Sets the wrapped stream to the end.
|
332
|
+
def set_to_begin; wrapped_stream.set_to_end; end
|
330
333
|
end
|
331
334
|
|
332
335
|
##
|
333
|
-
# The analog to Enumerable#collect for a stream is a MappedStream wrapping
|
334
|
-
# stream. A MappedStream is created by the method #collect, thus
|
335
|
-
# the behavior mixed in by Enumerable:
|
336
|
+
# The analog to Enumerable#collect for a stream is a MappedStream wrapping
|
337
|
+
# another stream. A MappedStream is created by the method #collect, thus
|
338
|
+
# modifying the behavior mixed in by Enumerable:
|
336
339
|
#
|
337
340
|
# (1..5).create_stream.collect {|x| x**2}.type ==> Stream::MappedStream
|
338
341
|
# (1..5).collect {|x| x**2} ==> [1, 4, 9, 16, 25]
|
339
342
|
# (1..5).create_stream.collect {|x| x**2}.to_a ==> [1, 4, 9, 16, 25]
|
340
343
|
class MappedStream < WrappedStream
|
341
344
|
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
345
|
+
##
|
346
|
+
# Creates a new MappedStream wrapping _otherStream_ which calls the block
|
347
|
+
# _mapping_ on each move.
|
348
|
+
def initialize(otherStream, &mapping)
|
349
|
+
super otherStream
|
350
|
+
@mapping = mapping
|
351
|
+
end
|
352
|
+
|
353
|
+
# Apply the stored closure for the next element in the wrapped stream and
|
354
|
+
# return the result.
|
355
|
+
def basic_forward; @mapping.call(super); end
|
356
|
+
# Apply the stored closure for the previous element in the wrapped stream
|
357
|
+
# and return the result.
|
358
|
+
def basic_backward; @mapping.call(super); end
|
356
359
|
end
|
357
360
|
|
358
361
|
##
|
359
|
-
# Given a stream of streams. Than a ConcatenatedStream is obtained by
|
360
|
-
# these in the given order. A ConcatenatedStream is created by
|
361
|
-
# Stream#concatenate or Stream#concatenate_collected send to a
|
362
|
-
# by the method + which concatenats two streams:
|
362
|
+
# Given a stream of streams. Than a ConcatenatedStream is obtained by
|
363
|
+
# concatenating these in the given order. A ConcatenatedStream is created by
|
364
|
+
# the methods Stream#concatenate or Stream#concatenate_collected send to a
|
365
|
+
# stream of streams or by the method + which concatenats two streams:
|
363
366
|
#
|
364
367
|
# ((1..3).create_stream + [4,5].create_stream).to_a ==> [1, 2, 3, 4, 5]
|
365
368
|
class ConcatenatedStream < WrappedStream
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
369
|
+
alias :streamOfStreams :wrapped_stream
|
370
|
+
private :streamOfStreams
|
371
|
+
|
372
|
+
# Creates a new ConcatenatedStream wrapping the stream of streams
|
373
|
+
# _streamOfStreams_.
|
374
|
+
def initialize(streamOfStreams)
|
375
|
+
super
|
376
|
+
set_to_begin
|
377
|
+
end
|
378
|
+
|
379
|
+
# If the current stream is at end, than at_end? has to look ahead to find a
|
380
|
+
# non empty in the stream of streams, which than gets the current stream.
|
381
|
+
def at_end?
|
382
|
+
if @currentStream.at_end?
|
383
|
+
return false
|
384
|
+
else
|
385
|
+
until streamOfStreams.at_end?
|
386
|
+
dir, @dirOfLastMove = @dirOfLastMove, :forward
|
387
|
+
s = streamOfStreams.basic_forward
|
388
|
+
# if last move was backwards, then @currentStream is
|
389
|
+
# equivalent to s. Move to next stream.
|
390
|
+
next if dir == :backward
|
391
|
+
s.set_to_begin
|
392
|
+
if s.at_end? # empty stream?
|
393
|
+
next # skip it
|
394
|
+
else
|
395
|
+
@currentStream = s
|
396
|
+
return false # found non empty stream
|
397
|
+
end
|
398
|
+
end # until
|
399
|
+
reachedBoundary # sets @dirOfLastMove and @currentStream
|
400
|
+
end
|
401
|
+
end
|
397
402
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
403
|
+
# Same as at_end? the other way round.
|
404
|
+
def at_beginning?
|
405
|
+
# same algorithm as at_end? the other way round.
|
406
|
+
if @currentStream.at_beginning?
|
407
|
+
return false
|
408
|
+
else
|
409
|
+
until streamOfStreams.at_beginning?
|
410
|
+
dir, @dirOfLastMove = @dirOfLastMove, :backward
|
411
|
+
s = streamOfStreams.basic_backward
|
412
|
+
next if dir == :forward
|
413
|
+
s.set_to_end
|
414
|
+
if s.at_beginning?
|
415
|
+
next
|
416
|
+
else
|
417
|
+
@currentStream = s
|
418
|
+
return false
|
419
|
+
end
|
420
|
+
end
|
421
|
+
reachedBoundary
|
415
422
|
end
|
416
|
-
reachedBoundary
|
417
|
-
end
|
418
423
|
end
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
424
|
+
|
425
|
+
def set_to_begin; super; reachedBoundary end
|
426
|
+
def set_to_end; super; reachedBoundary end
|
427
|
+
|
428
|
+
# Returns the next element of @currentStream. at_end? ensured that there is
|
429
|
+
# one.
|
430
|
+
def basic_forward; @currentStream.basic_forward end
|
431
|
+
# Returns the previous element of @currentStream. at_beginning? ensured that
|
432
|
+
# there is one.
|
433
|
+
def basic_backward; @currentStream.basic_backward end
|
434
|
+
|
435
|
+
private
|
436
|
+
|
437
|
+
def reachedBoundary
|
438
|
+
@currentStream = EmptyStream.instance
|
439
|
+
@dirOfLastMove = :none # not :forward or :backward
|
440
|
+
true
|
441
|
+
end
|
442
|
+
# Uff, this was the hardest stream to implement.
|
437
443
|
end # ConcatenatedStream
|
438
444
|
|
439
|
-
# An ImplicitStream is an easy way to create a stream on the fly without
|
440
|
-
# subclass of BasicStream. The basic methods required for a stream
|
441
|
-
# blocks:
|
445
|
+
# An ImplicitStream is an easy way to create a stream on the fly without
|
446
|
+
# defining a subclass of BasicStream. The basic methods required for a stream
|
447
|
+
# are defined with blocks:
|
442
448
|
#
|
443
449
|
# s = Stream::ImplicitStream.new { |s|
|
444
450
|
# x = 0
|
445
|
-
# s.at_end_proc = proc {x == 5}
|
446
|
-
# s.forward_proc = proc {x += 1 }
|
451
|
+
# s.at_end_proc = proc { x == 5 }
|
452
|
+
# s.forward_proc = proc { x += 1 }
|
447
453
|
# }
|
448
454
|
#
|
449
455
|
# s.to_a ==> [1, 2, 3, 4, 5]
|
@@ -457,51 +463,52 @@ module Stream
|
|
457
463
|
# remove the first or last element of an existing stream (see remove_first
|
458
464
|
# and remove_last).
|
459
465
|
class ImplicitStream < BasicStream
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
466
|
+
attr_writer :at_beginning_proc, :at_end_proc, :forward_proc,
|
467
|
+
:backward_proc, :set_to_begin_proc, :set_to_end_proc
|
468
|
+
attr_reader :wrapped_stream
|
469
|
+
|
470
|
+
# Create a new ImplicitStream which might wrap an existing stream
|
471
|
+
# _otherStream_. If _otherStream_ is supplied the blocks for the basic
|
472
|
+
# stream methods are initialized with closures that delegate all operations
|
473
|
+
# to the wrapped stream.
|
474
|
+
#
|
475
|
+
# If a block is given to new, than it is called with the new ImplicitStream
|
476
|
+
# stream as parameter letting the client overwriting the default blocks.
|
477
|
+
def initialize(otherStream=nil)
|
478
|
+
if otherStream
|
479
|
+
@wrapped_stream = otherStream
|
480
|
+
@at_beginning_proc = proc {otherStream.at_beginning?}
|
481
|
+
@at_end_proc = proc {otherStream.at_end?}
|
482
|
+
@forward_proc = proc {otherStream.basic_forward}
|
483
|
+
@backward_proc = proc {otherStream.basic_backward}
|
484
|
+
@set_to_end_proc = proc {otherStream.set_to_end}
|
485
|
+
@set_to_begin_proc = proc {otherStream.set_to_begin}
|
486
|
+
end
|
487
|
+
yield self if block_given? # let client overwrite defaults
|
488
|
+
|
489
|
+
@at_beginning_proc = proc {true} unless @at_beginning_proc
|
490
|
+
@at_end_proc = proc {true} unless @at_end_proc
|
491
|
+
end
|
492
|
+
|
493
|
+
# Returns the value of @at_beginning_proc.
|
494
|
+
def at_beginning?; @at_beginning_proc.call; end
|
495
|
+
# Returns the value of @at_end_proc.
|
496
|
+
def at_end?; @at_end_proc.call; end
|
497
|
+
|
498
|
+
# Returns the value of @forward_proc.
|
499
|
+
def basic_forward; @forward_proc.call; end
|
500
|
+
# Returns the value of @backward_proc_proc.
|
501
|
+
def basic_backward; @backward_proc.call; end
|
502
|
+
|
503
|
+
# Calls set_to_end_proc or super if set_to_end_proc is undefined.
|
504
|
+
def set_to_end
|
505
|
+
@set_to_end_proc ? @set_to_end_proc.call : super
|
506
|
+
end
|
507
|
+
|
508
|
+
# Calls set_to_begin_proc or super if set_to_begin_proc is undefined.
|
509
|
+
def set_to_begin
|
510
|
+
@set_to_begin_proc ? @set_to_begin_proc.call : super
|
479
511
|
end
|
480
|
-
yield self if block_given? # let client overwrite defaults
|
481
|
-
|
482
|
-
@at_beginning_proc = proc {true} unless @at_beginning_proc
|
483
|
-
@at_end_proc = proc {true} unless @at_end_proc
|
484
|
-
end
|
485
|
-
|
486
|
-
# Returns the value of @at_beginning_proc.
|
487
|
-
def at_beginning?; @at_beginning_proc.call; end
|
488
|
-
# Returns the value of @at_end_proc.
|
489
|
-
def at_end?; @at_end_proc.call; end
|
490
|
-
|
491
|
-
# Returns the value of @forward_proc.
|
492
|
-
def basic_forward; @forward_proc.call; end
|
493
|
-
# Returns the value of @backward_proc_proc.
|
494
|
-
def basic_backward; @backward_proc.call; end
|
495
|
-
|
496
|
-
# Calls set_to_end_proc or super if set_to_end_proc is undefined.
|
497
|
-
def set_to_end
|
498
|
-
@set_to_end_proc ? @set_to_end_proc.call : super
|
499
|
-
end
|
500
|
-
|
501
|
-
# Calls set_to_begin_proc or super if set_to_begin_proc is undefined.
|
502
|
-
def set_to_begin
|
503
|
-
@set_to_begin_proc ? @set_to_begin_proc.call : super
|
504
|
-
end
|
505
512
|
end # ImplicitStream
|
506
513
|
|
507
514
|
# Stream creation functions
|
@@ -509,59 +516,64 @@ module Stream
|
|
509
516
|
##
|
510
517
|
# Return a Stream::FilteredStream which iterates over all my elements
|
511
518
|
# satisfying the condition specified by the block.
|
512
|
-
def filtered
|
519
|
+
def filtered(&block); FilteredStream.new(self,&block); end
|
513
520
|
|
514
521
|
# Create a Stream::ReversedStream wrapper on self.
|
515
522
|
def reverse; ReversedStream.new self; end
|
516
|
-
|
517
|
-
# Create a Stream::MappedStream wrapper on self. Instead of returning the stream
|
518
|
-
# element on each move, the value of calling _mapping_ is returned instead. See
|
519
|
-
# Stream::MappedStream for examples.
|
520
|
-
def collect (&mapping); MappedStream.new(self, &mapping); end
|
521
523
|
|
522
|
-
# Create a Stream::
|
524
|
+
# Create a Stream::MappedStream wrapper on self. Instead of returning the
|
525
|
+
# stream element on each move, the value of calling _mapping_ is returned
|
526
|
+
# instead. See Stream::MappedStream for examples.
|
527
|
+
def collect(&mapping); MappedStream.new(self, &mapping); end
|
528
|
+
|
529
|
+
# Create a Stream::ConcatenatedStream on self, which must be a stream of
|
530
|
+
# streams.
|
523
531
|
def concatenate; ConcatenatedStream.new self; end
|
524
532
|
|
525
|
-
# Create a Stream::ConcatenatedStream, concatenated from streams build with
|
526
|
-
# block for each element of self:
|
527
|
-
#
|
533
|
+
# Create a Stream::ConcatenatedStream, concatenated from streams build with
|
534
|
+
# the block for each element of self:
|
535
|
+
#
|
528
536
|
# s = [1, 2, 3].create_stream.concatenate_collected { |i|
|
529
537
|
# [i,-i].create_stream
|
530
538
|
# }.
|
531
539
|
# s.to_a ==> [1, -1, 2, -2, 3, -3]
|
532
|
-
def concatenate_collected
|
540
|
+
def concatenate_collected(&mapping); self.collect(&mapping).concatenate; end
|
533
541
|
|
534
|
-
# Create a Stream::ConcatenatedStream by concatenatating the receiver and
|
542
|
+
# Create a Stream::ConcatenatedStream by concatenatating the receiver and
|
543
|
+
# _otherStream_
|
535
544
|
#
|
536
|
-
# (%w(a b c).create_stream + [4,5].create_stream).to_a
|
537
|
-
|
538
|
-
|
545
|
+
# (%w(a b c).create_stream + [4,5].create_stream).to_a
|
546
|
+
# ==> ["a", "b", "c", 4, 5]
|
547
|
+
def +(otherStream)
|
548
|
+
[self, otherStream].create_stream.concatenate
|
539
549
|
end
|
540
550
|
|
541
|
-
# Create a Stream::ImplicitStream which wraps the receiver stream by modifying
|
542
|
-
# or more basic methods of the receiver. As an example the method
|
543
|
-
# #modify to create an ImplicitStream which filters the
|
544
|
-
|
551
|
+
# Create a Stream::ImplicitStream which wraps the receiver stream by modifying
|
552
|
+
# one or more basic methods of the receiver. As an example the method
|
553
|
+
# remove_first uses #modify to create an ImplicitStream which filters the
|
554
|
+
# first element away.
|
555
|
+
def modify(&block); ImplicitStream.new(self, &block); end
|
545
556
|
|
546
557
|
# Returns a Stream::ImplicitStream wrapping a Stream::FilteredStream, which
|
547
558
|
# eliminates the first element of the receiver.
|
548
559
|
#
|
549
560
|
# (1..3).create_stream.remove_first.to_a ==> [2,3]
|
550
561
|
def remove_first
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
562
|
+
i = 0
|
563
|
+
filter = self.filtered { i += 1; i > 1 }
|
564
|
+
filter.modify { |s|
|
565
|
+
s.set_to_begin_proc = proc {filter.set_to_begin; i = 0}
|
566
|
+
}
|
556
567
|
end
|
557
568
|
|
558
569
|
# Returns a Stream which eliminates the first element of the receiver.
|
559
570
|
#
|
560
571
|
# (1..3).create_stream.remove_last.to_a ==> [1,2]
|
561
572
|
#
|
562
|
-
# <em>Take a look at the source. The implementation is inefficient but
|
573
|
+
# <em>Take a look at the source. The implementation is inefficient but
|
574
|
+
# elegant.</em>
|
563
575
|
def remove_last
|
564
|
-
|
576
|
+
self.reverse.remove_first.reverse # I like this one
|
565
577
|
end
|
566
578
|
end
|
567
579
|
|
data/test/test_helper.rb
ADDED
metadata
CHANGED
@@ -1,64 +1,116 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: stream
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Horst Duchene
|
8
8
|
autorequire: stream
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
11
|
+
date: 2019-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yard
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rdoc
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Module Stream defines an interface for external iterators.
|
70
|
+
email: monora@gmail.com
|
18
71
|
executables: []
|
19
|
-
|
20
72
|
extensions: []
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
-
|
73
|
+
extra_rdoc_files:
|
74
|
+
- README.rdoc
|
75
|
+
files:
|
76
|
+
- Gemfile
|
77
|
+
- Gemfile.lock
|
78
|
+
- README.rdoc
|
26
79
|
- Rakefile
|
27
|
-
-
|
80
|
+
- examples/examples.rb
|
81
|
+
- examples/streamtester.rb
|
28
82
|
- lib/generator2stream.rb
|
29
83
|
- lib/stream.rb
|
30
84
|
- test/bm.rb
|
85
|
+
- test/test_helper.rb
|
31
86
|
- test/testgenerator.rb
|
32
87
|
- test/teststream.rb
|
33
|
-
|
34
|
-
- examples/streamtester.rb
|
35
|
-
has_rdoc: true
|
36
|
-
homepage: http://rgl.rubyforge.org
|
88
|
+
homepage: https://github.com/monora/stream
|
37
89
|
licenses: []
|
38
|
-
|
90
|
+
metadata: {}
|
39
91
|
post_install_message:
|
40
|
-
rdoc_options:
|
41
|
-
|
42
|
-
|
92
|
+
rdoc_options:
|
93
|
+
- "--title"
|
94
|
+
- stream - Extended External Iterators
|
95
|
+
- "--main"
|
96
|
+
- README.rdoc
|
97
|
+
- "--line-numbers"
|
98
|
+
require_paths:
|
43
99
|
- lib
|
44
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
46
102
|
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
-
|
50
|
-
|
51
|
-
requirements:
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
52
107
|
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
version:
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
56
110
|
requirements: []
|
57
|
-
|
58
|
-
|
59
|
-
rubygems_version: 1.3.5
|
111
|
+
rubyforge_project:
|
112
|
+
rubygems_version: 2.7.7
|
60
113
|
signing_key:
|
61
|
-
specification_version:
|
62
|
-
summary:
|
114
|
+
specification_version: 4
|
115
|
+
summary: stream - Extended External Iterators
|
63
116
|
test_files: []
|
64
|
-
|
data/install.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rbconfig'
|
4
|
-
require 'ftools'
|
5
|
-
require 'find'
|
6
|
-
|
7
|
-
SRC_BASE = 'lib'
|
8
|
-
INSTDIR = File.join Config::CONFIG['sitedir']
|
9
|
-
|
10
|
-
def install
|
11
|
-
begin
|
12
|
-
pwd = Dir.pwd
|
13
|
-
Dir.chdir(SRC_BASE)
|
14
|
-
Dir['*.rb'].each do |file|
|
15
|
-
dst = File.join( INSTDIR, file )
|
16
|
-
File.install(file, dst, 0644, true)
|
17
|
-
end
|
18
|
-
Dir.chdir(pwd)
|
19
|
-
rescue
|
20
|
-
puts $!
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
install
|