static VALUE lazy_init_iterator(VALUE val, VALUE m, int argc, VALUE *argv) { VALUE result; if (argc == 1) { VALUE args[2]; args[0] = m; args[1] = val; result = rb_yield_values2(2, args); } else { VALUE args; int len = rb_long2int((long)argc + 1); args = rb_ary_tmp_new(len); rb_ary_push(args, m); if (argc > 0) { rb_ary_cat(args, argv, argc); } result = rb_yield_values2(len, RARRAY_PTR(args)); RB_GC_GUARD(args); } if (result == Qundef) rb_iter_break(); return Qnil; }
static VALUE lazy_take_while_func(VALUE val, VALUE args, int argc, VALUE *argv) { VALUE result = rb_yield_values2(argc - 1, &argv[1]); if (!RTEST(result)) return Qundef; rb_funcall2(argv[0], id_yield, argc - 1, argv + 1); return Qnil; }
static VALUE lazy_map_func(VALUE val, VALUE m, int argc, VALUE *argv) { VALUE result = rb_yield_values2(argc - 1, &argv[1]); rb_funcall(argv[0], id_yield, 1, result); return Qnil; }
static VALUE lazy_drop_while_func(VALUE val, VALUE args, int argc, VALUE *argv) { VALUE memo = rb_attr_get(argv[0], id_memo); if (NIL_P(memo) && !RTEST(rb_yield_values2(argc - 1, &argv[1]))) { rb_ivar_set(argv[0], id_memo, memo = Qtrue); } if (memo == Qtrue) { rb_funcall2(argv[0], id_yield, argc - 1, argv + 1); } return Qnil; }
static VALUE lazy_drop_while_func(VALUE val, VALUE args, int argc, VALUE *argv) { NODE *memo = RNODE(args); if (!memo->u3.state && !RTEST(rb_yield_values2(argc - 1, &argv[1]))) { memo->u3.state = TRUE; } if (memo->u3.state) { rb_funcall2(argv[0], id_yield, argc - 1, argv + 1); } return Qnil; }
static VALUE lazy_flat_map_func(VALUE val, VALUE m, int argc, VALUE *argv) { VALUE result = rb_yield_values2(argc - 1, &argv[1]); if (TYPE(result) == T_ARRAY) { long i; for (i = 0; i < RARRAY_LEN(result); i++) { rb_funcall(argv[0], id_yield, 1, RARRAY_PTR(result)[i]); } } else { NODE *memo; memo = NEW_MEMO(result, argv[0], 0); rb_rescue2(lazy_flat_map_each, (VALUE) memo, lazy_flat_map_to_ary, (VALUE) memo, rb_eNoMethodError, (VALUE)0); } return Qnil; }
static VALUE lazy_flat_map_func(VALUE val, VALUE m, int argc, VALUE *argv) { VALUE result = rb_yield_values2(argc - 1, &argv[1]); if (RB_TYPE_P(result, T_ARRAY)) { long i; for (i = 0; i < RARRAY_LEN(result); i++) { rb_funcall(argv[0], id_yield, 1, RARRAY_AREF(result, i)); } } else { if (rb_respond_to(result, id_force) && rb_respond_to(result, id_each)) { lazy_flat_map_each(result, argv[0]); } else { lazy_flat_map_to_ary(result, argv[0]); } } return Qnil; }
static VALUE yielder_yield_i(VALUE obj, VALUE memo, int argc, VALUE *argv) { return rb_yield_values2(argc, argv); }
static VALUE enumerator_each_i(VALUE v, VALUE enum_obj, int argc, VALUE *argv) { return rb_yield_values2(argc, argv); }