'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; function falsyValue(item) { if (Array.isArray(item)) { if (item.length) { return false; } } else if (item !== undefined && item !== null && (typeof item === 'undefined' ? 'undefined' : _typeof(item)) === 'object') { if (Object.keys(item).length) { return false; } } else if (item) { return false; } return true; } function filterObject(func, items) { var result = {}; Object.keys(items).forEach(function (key) { if (func) { if (func(items[key], key)) { result[key] = items[key]; } } else if (!falsyValue(items[key])) { result[key] = items[key]; } }); return result; } function filterArray(func, items) { if (func) { return items.filter(func); } var result = []; for (var i = 0; i < items.length; i += 1) { var item = items[i]; if (!falsyValue(item)) { result.push(item); } } return result; } module.exports = function filter(fn) { var func = fn || false; var filteredItems = null; if (Array.isArray(this.items)) { filteredItems = filterArray(func, this.items); } else { filteredItems = filterObject(func, this.items); } return new this.constructor(filteredItems); };