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.
47 lines
1.1 KiB
47 lines
1.1 KiB
3 years ago
|
/**
|
||
|
* Obliterator Iter Function
|
||
|
* ==========================
|
||
|
*
|
||
|
* Function coercing values to an iterator. It can be quite useful when needing
|
||
|
* to handle iterables and iterators the same way.
|
||
|
*/
|
||
|
var Iterator = require('./iterator.js');
|
||
|
var support = require('./support.js');
|
||
|
|
||
|
var ARRAY_BUFFER_SUPPORT = support.ARRAY_BUFFER_SUPPORT;
|
||
|
var SYMBOL_SUPPORT = support.SYMBOL_SUPPORT;
|
||
|
|
||
|
function iterOrNull(target) {
|
||
|
// Indexed sequence
|
||
|
if (
|
||
|
typeof target === 'string' ||
|
||
|
Array.isArray(target) ||
|
||
|
(ARRAY_BUFFER_SUPPORT && ArrayBuffer.isView(target))
|
||
|
)
|
||
|
return Iterator.fromSequence(target);
|
||
|
|
||
|
// Invalid value
|
||
|
if (typeof target !== 'object' || target === null) return null;
|
||
|
|
||
|
// Iterable
|
||
|
if (SYMBOL_SUPPORT && typeof target[Symbol.iterator] === 'function')
|
||
|
return target[Symbol.iterator]();
|
||
|
|
||
|
// Iterator duck-typing
|
||
|
if (typeof target.next === 'function') return target;
|
||
|
|
||
|
// Invalid object
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
module.exports = function iter(target) {
|
||
|
var iterator = iterOrNull(target);
|
||
|
|
||
|
if (!iterator)
|
||
|
throw new Error(
|
||
|
'obliterator: target is not iterable nor a valid iterator.'
|
||
|
);
|
||
|
|
||
|
return iterator;
|
||
|
};
|