Feature #15901 ยป 0001-Implement-Enumerator-Lazy-eager.patch
enumerator.c | ||
---|---|---|
return lazy;
|
||
}
|
||
static VALUE
|
||
lazy_eager_size(VALUE self, VALUE args, VALUE eobj)
|
||
{
|
||
return enum_size(self);
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* lzy.eager -> enum
|
||
*
|
||
* Returns a non-lazy Enumerator converted from the lazy enumerator.
|
||
*
|
||
* This is useful where a normal Enumerable object needs to be
|
||
* generated while lazy operation is still desired to avoid creating
|
||
* intermediate arrays.
|
||
*
|
||
* enum = huge_collection.lazy.flat_map(&:children).reject(&:disabled?).eager
|
||
* enum.map {|x| ...} # an array is returned
|
||
*/
|
||
static VALUE
|
||
lazy_eager(VALUE self)
|
||
{
|
||
return enumerator_init(enumerator_allocate(rb_cEnumerator),
|
||
self, sym_each, 0, 0, lazy_eager_size, Qnil);
|
||
}
|
||
static VALUE
|
||
lazyenum_yield(VALUE proc_entry, struct MEMO *result)
|
||
{
|
||
... | ... | |
rb_define_method(rb_cLazy, "initialize", lazy_initialize, -1);
|
||
rb_define_method(rb_cLazy, "to_enum", lazy_to_enum, -1);
|
||
rb_define_method(rb_cLazy, "enum_for", lazy_to_enum, -1);
|
||
rb_define_method(rb_cLazy, "eager", lazy_eager, 0);
|
||
rb_define_method(rb_cLazy, "map", lazy_map, 0);
|
||
rb_define_method(rb_cLazy, "collect", lazy_map, 0);
|
||
rb_define_method(rb_cLazy, "flat_map", lazy_flat_map, 0);
|
test/ruby/test_lazy_enumerator.rb | ||
---|---|---|
EOS
|
||
end
|
||
def test_lazy_eager
|
||
lazy = [1, 2, 3].lazy.map { |x| x * 2 }
|
||
enum = lazy.eager
|
||
assert_equal Enumerator, enum.class
|
||
assert_equal 3, enum.size
|
||
assert_equal [1, 2, 3], enum.map { |x| x / 2 }
|
||
end
|
||
def test_lazy_to_enum
|
||
lazy = [1, 2, 3].lazy
|
||
def lazy.foo(*args)
|