Method: EventMachine::Iterator#inject

Defined in:
lib/em/iterator.rb

#inject(obj, foreach, after) ⇒ Object

Inject the results of an asynchronous iteration onto a given object.

EM::Iterator.new(%w[ pwd uptime uname date ], 2).inject({}, proc{ |hash,cmd,iter|
  EM.system(cmd){ |output,status|
    hash[cmd] = status.exitstatus == 0 ? output.strip : nil
    iter.return(hash)
  }
}, proc{ |results|
  p results
})


199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/em/iterator.rb', line 199

def inject(obj, foreach, after)
  each(proc{ |item,iter|
    is_done = false
    on_done = proc{ |res|
      raise RuntimeError, 'already returned a value for this iteration' if is_done
      is_done = true

      obj = res
      iter.next
    }
    class << on_done
      alias :return :call
      def next
        raise NoMethodError, 'must call #return on an inject iterator'
      end
    end

    foreach.call(obj, item, on_done)
  }, proc{
    after.call(obj)
  })
end