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

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;