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