summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/array.c b/array.c
index f706a04a82..d88c333dd2 100644
--- a/array.c
+++ b/array.c
@@ -1234,6 +1234,44 @@ ary_nitems(ary)
return INT2FIX(n);
}
+static VALUE
+ary_flatten_bang(ary)
+ VALUE ary;
+{
+ int i;
+ int mod = 0;
+
+ ary_modify(ary);
+ for (;;) {
+ int lmod = 0;
+
+ for (i=0; i<RARRAY(ary)->len; i++) {
+ if (TYPE(RARRAY(ary)->ptr[i]) == T_ARRAY) {
+ VALUE ary2 = RARRAY(ary)->ptr[i];
+
+ ary_replace(ary, i, RARRAY(ary2)->len, ary2);
+ i += RARRAY(ary2)->len - 1;
+ lmod++;
+ }
+ }
+ if (lmod == 0) break;
+ mod = lmod;
+ }
+
+ if (mod == 0) return Qnil;
+ return ary;
+}
+
+static VALUE
+ary_flatten(ary)
+ VALUE ary;
+{
+ VALUE v = ary_flatten_bang(ary_clone(ary));
+
+ if (NIL_P(v)) return ary;
+ return v;
+}
+
extern VALUE mEnumerable;
void
@@ -1304,6 +1342,8 @@ Init_Array()
rb_define_method(cArray, "uniq!", ary_uniq_bang, 0);
rb_define_method(cArray, "compact", ary_compact, 0);
rb_define_method(cArray, "compact!", ary_compact_bang, 0);
+ rb_define_method(cArray, "flatten", ary_flatten, 0);
+ rb_define_method(cArray, "flatten!", ary_flatten_bang, 0);
rb_define_method(cArray, "nitems", ary_nitems, 0);
cmp = rb_intern("<=>");