Issue #4890 has been updated by Joshua Ballanco.
I think the main difference is that current Enumerable#{map|select|inject} use yield semantics with the block. This is not always conducive to lazy evaluation:
class AlwaysThree
include Enumerable
def each
yield 3
end
end
AlwaysThree.new.each { |i| puts i } #=> 3
AlwaysThree.new.map { |i| i**2 } #=> [9]
I realize that's a trivial example, but I think lazy enumerables will require generator semantics. i.e. Instead of everything being based around #each, it should be based around #next.
----------------------------------------
Feature #4890: Enumerable#lazy
https://bugs.ruby-lang.org/issues/4890
Author: Yutaka HARA
Status: Assigned
Priority: Normal
Assignee: Yutaka HARA
Category: core
Target version: 2.0.0
=begin
= Example
Print first 100 primes which are in form of n^2+1
require 'prime'
INFINITY = 1.0 / 0
p (1..INFINITY).lazy.map{|n| n**2+1}.select{|m| m.prime?}.take(100)
(Example taken from enumerable_lz; thanks @antimon2)
= Description
Enumerable#lazy returns an instance of Enumerable::Lazy.
This is the only method added to the existing bulit-in classes.
Lazy is a subclass of Enumerator, which includes Enumerable.
So you can call any methods of Enumerable on Lazy, except methods like
map, select, etc. are redefined as 'lazy' versions.
= Sample implementation
((<URL:https://gist.github.com/1028609>))
(also attached to this ticket)
=end
--
http://bugs.ruby-lang.org/