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.
97 lines
1.8 KiB
97 lines
1.8 KiB
3 years ago
|
/**
|
||
|
* Obliterator Iterator Class
|
||
|
* ===========================
|
||
|
*
|
||
|
* Simple class representing the library's iterators.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Iterator class.
|
||
|
*
|
||
|
* @constructor
|
||
|
* @param {function} next - Next function.
|
||
|
*/
|
||
|
function Iterator(next) {
|
||
|
if (typeof next !== 'function')
|
||
|
throw new Error('obliterator/iterator: expecting a function!');
|
||
|
|
||
|
this.next = next;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If symbols are supported, we add `next` to `Symbol.iterator`.
|
||
|
*/
|
||
|
if (typeof Symbol !== 'undefined')
|
||
|
Iterator.prototype[Symbol.iterator] = function () {
|
||
|
return this;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returning an iterator of the given values.
|
||
|
*
|
||
|
* @param {any...} values - Values.
|
||
|
* @return {Iterator}
|
||
|
*/
|
||
|
Iterator.of = function () {
|
||
|
var args = arguments,
|
||
|
l = args.length,
|
||
|
i = 0;
|
||
|
|
||
|
return new Iterator(function () {
|
||
|
if (i >= l) return {done: true};
|
||
|
|
||
|
return {done: false, value: args[i++]};
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returning an empty iterator.
|
||
|
*
|
||
|
* @return {Iterator}
|
||
|
*/
|
||
|
Iterator.empty = function () {
|
||
|
var iterator = new Iterator(function () {
|
||
|
return {done: true};
|
||
|
});
|
||
|
|
||
|
return iterator;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returning an iterator over the given indexed sequence.
|
||
|
*
|
||
|
* @param {string|Array} sequence - Target sequence.
|
||
|
* @return {Iterator}
|
||
|
*/
|
||
|
Iterator.fromSequence = function (sequence) {
|
||
|
var i = 0,
|
||
|
l = sequence.length;
|
||
|
|
||
|
return new Iterator(function () {
|
||
|
if (i >= l) return {done: true};
|
||
|
|
||
|
return {done: false, value: sequence[i++]};
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returning whether the given value is an iterator.
|
||
|
*
|
||
|
* @param {any} value - Value.
|
||
|
* @return {boolean}
|
||
|
*/
|
||
|
Iterator.is = function (value) {
|
||
|
if (value instanceof Iterator) return true;
|
||
|
|
||
|
return (
|
||
|
typeof value === 'object' &&
|
||
|
value !== null &&
|
||
|
typeof value.next === 'function'
|
||
|
);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Exporting.
|
||
|
*/
|
||
|
module.exports = Iterator;
|