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
						
					
					
				/**
 | 
						|
 * 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;
 |