--- /dev/null
+define(['../lang/isArray', './append'], function (isArray, append) {
+
+ /*
+ * Helper function to flatten to a destination array.
+ * Used to remove the need to create intermediate arrays while flattening.
+ */
+ function flattenTo(arr, result, level) {
+ if (level === 0) {
+ append(result, arr);
+ return result;
+ }
+
+ var value,
+ i = -1,
+ len = arr.length;
+ while (++i < len) {
+ value = arr[i];
+ if (isArray(value)) {
+ flattenTo(value, result, level - 1);
+ } else {
+ result.push(value);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Recursively flattens an array.
+ * A new array containing all the elements is returned.
+ * If level is specified, it will only flatten up to that level.
+ */
+ function flatten(arr, level) {
+ if (arr == null) {
+ return [];
+ }
+
+ level = level == null ? -1 : level;
+ return flattenTo(arr, [], level);
+ }
+
+ return flatten;
+
+});
+