/* iterator: collect() */
static VALUE
na_collect(VALUE obj1)
{
int i, sz;
VALUE v, obj2;
struct NARRAY *a1, *a2;
char *p1, *p2;
void (*get)(), (*set)();
GetNArray(obj1,a1);
obj2 = na_make_object(a1->type, a1->rank, a1->shape, CLASS_OF(obj1));
GetNArray(obj2,a2);
p1 = a1->ptr;
p2 = a2->ptr;
sz = na_sizeof[a1->type];
get = SetFuncs[NA_ROBJ][a1->type];
set = SetFuncs[a1->type][NA_ROBJ];
for ( i=a1->total; i-->0; ) {
(*get)( 1, &v, 0, p1, 0 );
v = rb_yield(v);
(*set)( 1, p2, 0, &v, 0 );
p1 += sz;
p2 += sz;
}
return obj2;
}