You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.0 KiB
94 lines
2.0 KiB
3 years ago
|
/**
|
||
|
* 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;
|