class Stream::ConcatenatedStream
Given a stream of streams. Than a ConcatenatedStream is obtained by concatenating these in the given order. A ConcatenatedStream is created by the methods Stream#concatenate or Stream#concatenate_collected send to a stream of streams or by the method + which concatenats two streams:
((1..3).create_stream + [4,5].create_stream).to_a ==> [1, 2, 3, 4, 5]
Public Class Methods
new(streamOfStreams)
click to toggle source
Creates a new ConcatenatedStream wrapping the stream of streams streamOfStreams.
Calls superclass method
Stream::WrappedStream.new
# File lib/stream.rb, line 370 def initialize (streamOfStreams) super set_to_begin end
Public Instance Methods
at_beginning?()
click to toggle source
Same as at_end? the other way round.
# File lib/stream.rb, line 399 def at_beginning? # same algorithm as at_end? the other way round. Could we do it # with metaprogramming? @currentStream.at_beginning? and begin until streamOfStreams.at_beginning? dir, @dirOfLastMove = @dirOfLastMove, :backward s = streamOfStreams.basic_backward next if dir == :forward s.set_to_end if s.at_beginning? next else @currentStream = s return false end end reachedBoundary end end
at_end?()
click to toggle source
If the current stream is at end, than at_end? has to look ahead to find a non empty in the stream of streams, which than gets the current stream.
# File lib/stream.rb, line 377 def at_end? @currentStream.at_end? and begin until streamOfStreams.at_end? dir, @dirOfLastMove = @dirOfLastMove, :forward s = streamOfStreams.basic_forward # if last move was backwards, then @currentStream is # equivalent to s. Move to next stream. next if dir == :backward s.set_to_begin if s.at_end? # empty stream? next # skip it else @currentStream = s return false # found non empty stream end end reachedBoundary # sets @dirOfLastMove and @currentStream end end
basic_backward()
click to toggle source
Returns the previous element of @currentStream. at_beginning? ensured that there is one.
# File lib/stream.rb, line 427 def basic_backward; @currentStream.basic_backward end
basic_forward()
click to toggle source
Returns the next element of @currentStream. at_end? ensured that there is one.
# File lib/stream.rb, line 424 def basic_forward; @currentStream.basic_forward end
set_to_begin()
click to toggle source
Calls superclass method
Stream::WrappedStream#set_to_begin
# File lib/stream.rb, line 420 def set_to_begin; super; reachedBoundary end
set_to_end()
click to toggle source
Calls superclass method
Stream::WrappedStream#set_to_end
# File lib/stream.rb, line 421 def set_to_end; super; reachedBoundary end
Private Instance Methods
reachedBoundary()
click to toggle source
# File lib/stream.rb, line 431 def reachedBoundary @currentStream = EmptyStream.instance @dirOfLastMove = :none # not :forward or :backward true end