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