Files: 50acb42b9733f299a0a10fdb8a84d71ecc04ba7b / lib / next-stepper.js
1190 bytesRaw
1 | const pull = require('pull-stream') |
2 | const Next = require('pull-next') |
3 | var ENDED = {} |
4 | |
5 | module.exports = nextStepper |
6 | |
7 | // TODO - this should be another module? |
8 | |
9 | function nextStepper (createStream, opts, range) { |
10 | range = range || (opts.reverse ? 'lt' : 'gt') |
11 | |
12 | var last = null |
13 | var count = -1 |
14 | |
15 | return Next(function () { |
16 | if (last) { |
17 | if (count === 0) return |
18 | var value = opts[range] = last |
19 | if (value === ENDED) return |
20 | last = null |
21 | } |
22 | return pull( |
23 | createStream(clone(opts)), |
24 | pull.through(function (msg) { |
25 | count++ |
26 | if (!msg.sync) { |
27 | last = msg |
28 | } |
29 | }, function (err) { |
30 | // retry on errors... |
31 | if (err) { |
32 | count = -1 |
33 | return count |
34 | } |
35 | // end stream if there were no results |
36 | if (last == null) last = ENDED |
37 | }) |
38 | ) |
39 | }) |
40 | } |
41 | |
42 | function get (obj, path) { |
43 | if (!obj) return undefined |
44 | if (typeof path === 'string') return obj[path] |
45 | if (Array.isArray(path)) { |
46 | for (var i = 0; obj && i < path.length; i++) { |
47 | obj = obj[path[i]] |
48 | } |
49 | return obj |
50 | } |
51 | } |
52 | |
53 | function clone (obj) { |
54 | var _obj = {} |
55 | for (var k in obj) _obj[k] = obj[k] |
56 | return _obj |
57 | } |
58 |
Built with git-ssb-web