Thanks guys, great stuff.

In reply to the first poster, I have a lazy_select, and lazy_map like 
this:

module Enumerable
  def lazy_select(&block)
    Enumerator.new do |enum|
      self.each do |value|
        enum.yield(value) if block.call(value)
      end
    end
  end

  def lazy_map(&block)
    Enumerator.new do |enum|
      self.each do |value|
        enum.yield(block.call(value))
      end
    end
  end
end
-- 
Posted via http://www.ruby-forum.com/.