'use strict'; var _require = require('../helpers/is'), isArray = _require.isArray, isObject = _require.isObject; module.exports = function flatten(depth) { var flattenDepth = depth || Infinity; var fullyFlattened = false; var collection = []; var flat = function flat(items) { collection = []; if (isArray(items)) { items.forEach(function (item) { if (isArray(item)) { collection = collection.concat(item); } else if (isObject(item)) { Object.keys(item).forEach(function (property) { collection = collection.concat(item[property]); }); } else { collection.push(item); } }); } else { Object.keys(items).forEach(function (property) { if (isArray(items[property])) { collection = collection.concat(items[property]); } else if (isObject(items[property])) { Object.keys(items).forEach(function (prop) { collection = collection.concat(items[prop]); }); } else { collection.push(items[property]); } }); } fullyFlattened = collection.filter(function (item) { return isObject(item); }); fullyFlattened = fullyFlattened.length === 0; flattenDepth -= 1; }; flat(this.items); while (!fullyFlattened && flattenDepth > 0) { flat(collection); } return new this.constructor(collection); };