import isArray from '../lang/isArray';
import append from './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;
    }

    let value;
    let i = -1;
    const 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);
}

export default flatten;
