Class: Stream::FilteredStream

Inherits:
WrappedStream show all
Defined in:
lib/stream.rb

Overview

A FilteredStream selects all elements which satisfy a given booelan block of another stream being wrapped.

A FilteredStream is created by the method #filtered:

(1..6).create_stream.filtered { |x| x % 2 == 0 }.to_a ==> [2, 4, 6]

Instance Attribute Summary

Attributes inherited from WrappedStream

#wrapped_stream

Instance Method Summary collapse

Methods inherited from WrappedStream

#unwrapped

Methods included from Stream

#+, #backward, #collect, #concatenate, #concatenate_collected, #create_stream, #current, #current_edge, #each, #empty?, #filtered, #first, #forward, #last, #modify, #move_backward_until, #move_forward_until, #peek, #remove_first, #remove_last, #reverse, #unwrapped

Methods included from Enumerable

#create_stream

Constructor Details

#initialize(otherStream, &filter) ⇒ FilteredStream

Create a new FilteredStream wrapping otherStream and selecting all its elements which satisfy the condition defined by the block_filter_.


243
244
245
246
247
248
# File 'lib/stream.rb', line 243

def initialize (otherStream, &filter)
  super otherStream
  @filter = filter
  @positionHolder = IntervalStream.new
  set_to_begin
end

Instance Method Details

#at_beginning?Boolean

Returns:

  • (Boolean)

250
# File 'lib/stream.rb', line 250

def at_beginning?; @positionHolder.at_beginning?; end

#at_end?Boolean

at_end? has to look ahead if there is an element satisfing the filter

Returns:

  • (Boolean)

253
254
255
256
257
258
259
260
261
262
# File 'lib/stream.rb', line 253

def at_end?
  @positionHolder.at_end? and
	begin
	  if @peek.nil?
		@peek = wrapped_stream.move_forward_until( &@filter ) or return true
		@positionHolder.increment_stop
	  end
	  false
	end
end

#basic_backwardObject


277
278
279
280
281
282
# File 'lib/stream.rb', line 277

def basic_backward
  wrapped_stream.backward unless @peek.nil?
  @peek = nil
  @positionHolder.backward
  wrapped_stream.move_backward_until(&@filter) or self
end

#basic_forwardObject


264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/stream.rb', line 264

def basic_forward
  result =
	if @peek.nil? 
	  wrapped_stream.move_forward_until(&@filter)
	else
	  # Do not move!!
	  @peek
	end
  @peek = nil
  @positionHolder.forward
  result
end

#posObject

Returns the current position of the stream.


296
# File 'lib/stream.rb', line 296

def pos; @positionHolder.pos; end

#set_to_beginObject


289
290
291
292
293
# File 'lib/stream.rb', line 289

def set_to_begin
  super
  @peek = nil
  @positionHolder.set_to_begin
end

#set_to_endObject


284
285
286
287
# File 'lib/stream.rb', line 284

def set_to_end
  # Not super which is a WrappedStream, but same behavior as in Stream
  until at_end?; basic_forward; end
end