/*
* call-seq:
* e.each_slice(n) {...}
*
* Iterates the given block for each slice of <n> elements.
*
* e.g.:
* (1..10).each_slice(3) {|a| p a}
* # outputs below
* [1, 2, 3]
* [4, 5, 6]
* [7, 8, 9]
* [10]
*
*/
static VALUE
enum_each_slice(obj, n)
VALUE obj, n;
{
long size = NUM2LONG(n);
NODE *memo;
VALUE ary;
if (size <= 0) rb_raise(rb_eArgError, "invalid slice size");
memo = rb_node_newnode(NODE_MEMO, rb_ary_new2(size), 0, size);
rb_iterate(rb_each, obj, each_slice_i, (VALUE)memo);
ary = memo->u1.value;
if (RARRAY(ary)->len > 0) rb_yield(ary);
return Qnil;
}