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