/** * Mnemonist Iterable Function * ============================ * * Harmonized iteration helpers over mixed iterable targets. */ var forEach = require('obliterator/foreach'); var typed = require('./typed-arrays.js'); /** * Function used to determine whether the given object supports array-like * random access. * * @param {any} target - Target object. * @return {boolean} */ function isArrayLike(target) { return Array.isArray(target) || typed.isTypedArray(target); } /** * Function used to guess the length of the structure over which we are going * to iterate. * * @param {any} target - Target object. * @return {number|undefined} */ function guessLength(target) { if (typeof target.length === 'number') return target.length; if (typeof target.size === 'number') return target.size; return; } /** * Function used to convert an iterable to an array. * * @param {any} target - Iteration target. * @return {array} */ function toArray(target) { var l = guessLength(target); var array = typeof l === 'number' ? new Array(l) : []; var i = 0; // TODO: we could optimize when given target is array like forEach(target, function(value) { array[i++] = value; }); return array; } /** * Same as above but returns a supplementary indices array. * * @param {any} target - Iteration target. * @return {array} */ function toArrayWithIndices(target) { var l = guessLength(target); var IndexArray = typeof l === 'number' ? typed.getPointerArray(l) : Array; var array = typeof l === 'number' ? new Array(l) : []; var indices = typeof l === 'number' ? new IndexArray(l) : []; var i = 0; // TODO: we could optimize when given target is array like forEach(target, function(value) { array[i] = value; indices[i] = i++; }); return [array, indices]; } /** * Exporting. */ exports.isArrayLike = isArrayLike; exports.guessLength = guessLength; exports.toArray = toArray; exports.toArrayWithIndices = toArrayWithIndices;