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.
49 lines
1.1 KiB
49 lines
1.1 KiB
/* Copyright (c) 2013 Rod Vagg, MIT License */ |
|
|
|
function AbstractIterator (db) { |
|
this.db = db |
|
this._ended = false |
|
this._nexting = false |
|
} |
|
|
|
AbstractIterator.prototype.next = function (callback) { |
|
var self = this |
|
|
|
if (typeof callback != 'function') |
|
throw new Error('next() requires a callback argument') |
|
|
|
if (self._ended) |
|
return callback(new Error('cannot call next() after end()')) |
|
if (self._nexting) |
|
return callback(new Error('cannot call next() before previous next() has completed')) |
|
|
|
self._nexting = true |
|
if (typeof self._next == 'function') { |
|
return self._next(function () { |
|
self._nexting = false |
|
callback.apply(null, arguments) |
|
}) |
|
} |
|
|
|
process.nextTick(function () { |
|
self._nexting = false |
|
callback() |
|
}) |
|
} |
|
|
|
AbstractIterator.prototype.end = function (callback) { |
|
if (typeof callback != 'function') |
|
throw new Error('end() requires a callback argument') |
|
|
|
if (this._ended) |
|
return callback(new Error('end() already called on iterator')) |
|
|
|
this._ended = true |
|
|
|
if (typeof this._end == 'function') |
|
return this._end(callback) |
|
|
|
process.nextTick(callback) |
|
} |
|
|
|
module.exports = AbstractIterator
|
|
|