Class: Marso::FiberProjectionMany

Inherits:
Enumerate show all
Defined in:
lib/marso/toolbelt/fiberpiping.rb

Constant Summary

Constants inherited from Enumerate

Enumerate::STOP_MSG

Instance Attribute Summary

Attributes inherited from Enumerate

#process, #src

Instance Method Summary collapse

Methods inherited from Enumerate

#clone, #execute, from, #select, #select_many, #to_a, #where, #|

Constructor Details

#initialize(process, source = {}) ⇒ FiberProjectionMany

Returns a new instance of FiberProjectionMany.



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/marso/toolbelt/fiberpiping.rb', line 130

def initialize(process, source={})
  @src = source
  @process = process
  @is_inside_inner_enumerate = false

  @fiber_delegate = Fiber.new do
    output = []
    while input = Fiber.yield(output)
      output = process.call(input)

      @is_inside_inner_enumerate = true

      output.each { |o|
        Fiber.yield(o)
      }

      @is_inside_inner_enumerate = false
    end
  end

  @fiber_delegate.resume
end

Instance Method Details

#resumeObject



153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/marso/toolbelt/fiberpiping.rb', line 153

def resume
  if @src.is_a?(Marso::Enumerate) && !@is_inside_inner_enumerate
    output = @fiber_delegate.resume(@src.resume)
    output = @fiber_delegate.resume(@src.resume)  if output.is_a?(Array) && output.empty?
    return output
  else
    output = @fiber_delegate.resume
    output = @fiber_delegate.resume(@src.resume) unless @is_inside_inner_enumerate
    output = @fiber_delegate.resume(@src.resume)  if output.is_a?(Array) && output.empty?
    return output
  end
end

#source(other_source) ⇒ Object



166
167
168
# File 'lib/marso/toolbelt/fiberpiping.rb', line 166

def source(other_source)
  FiberProjectionMany.new(@process, other_source)
end