(function() { db.generator = function generator() { var that = this, myQuery = null; default_offset = 0, limit = 5; // text parameter for queries function _generator(text) { var db = that; var R = [], offset = default_offset, last = limit, done = false; // see what next() would return function peek() { console.log("peek"); if(done) return Promise.resolve({done: true}); else if(R.length) return Promise.resolve({value: R[0], done: false}); else return fetch().then(peek); } // returns a Promise that resolves to {value, done} function next() { console.log("next"); if(done) return Promise.resolve({done: true}); else if(R.length) return Promise.resolve({value: R.shift(), done: false}); else return fetch().then(next); } // returns Promise after fetching more results and setting internal // buffer to contain the results, starting at function fetch() { console.log("fetch"); return myQuery(text, limit, offset).then(function(rows){ if(rows.length) { R = rows; offset += rows.length; last = rows.length; } else { done = true; } }); } return { next: next, peek: peek } } // modify type of generator _generator.query = function(q) { if (!arguments.length) return myQuery; myQuery = q; return _generator; }; // set or get size of internal buffer _generator.limit = function(_) { if (!arguments.length) return limit; limit = _; return _generator; }; // set or get offset _generator.offset = function(_) { if (!arguments.length) return offset; offset = _; return _generator; }; return _generator; } })();