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.
50 lines
1.1 KiB
50 lines
1.1 KiB
5 years ago
|
/* 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
|