@@ -56,25 +56,26 @@ function lte (value) {
56
56
return compare ( value , this [ kUpperBound ] ) <= 0
57
57
}
58
58
59
+ // TODO (v2): support signal
59
60
class MemoryIterator extends AbstractIterator {
60
61
constructor ( db , options ) {
61
62
super ( db , options )
62
63
this [ kInit ] ( db [ kTree ] , options )
63
64
}
64
65
65
- _next ( callback ) {
66
- if ( ! this [ kIterator ] . valid ) return this . nextTick ( callback )
66
+ async _next ( ) {
67
+ if ( ! this [ kIterator ] . valid ) return undefined
67
68
68
69
const key = this [ kIterator ] . key
69
70
const value = this [ kIterator ] . value
70
71
71
- if ( ! this [ kTest ] ( key ) ) return this . nextTick ( callback )
72
+ if ( ! this [ kTest ] ( key ) ) return undefined
72
73
73
74
this [ kIterator ] [ this [ kAdvance ] ] ( )
74
- this . nextTick ( callback , null , key , value )
75
+ return [ key , value ]
75
76
}
76
77
77
- _nextv ( size , options , callback ) {
78
+ async _nextv ( size , options ) {
78
79
const it = this [ kIterator ]
79
80
const entries = [ ]
80
81
@@ -83,10 +84,10 @@ class MemoryIterator extends AbstractIterator {
83
84
it [ this [ kAdvance ] ] ( )
84
85
}
85
86
86
- this . nextTick ( callback , null , entries )
87
+ return entries
87
88
}
88
89
89
- _all ( options , callback ) {
90
+ async _all ( options ) {
90
91
const size = this . limit - this . count
91
92
const it = this [ kIterator ]
92
93
const entries = [ ]
@@ -96,7 +97,7 @@ class MemoryIterator extends AbstractIterator {
96
97
it [ this [ kAdvance ] ] ( )
97
98
}
98
99
99
- this . nextTick ( callback , null , entries )
100
+ return entries
100
101
}
101
102
}
102
103
@@ -106,17 +107,17 @@ class MemoryKeyIterator extends AbstractKeyIterator {
106
107
this [ kInit ] ( db [ kTree ] , options )
107
108
}
108
109
109
- _next ( callback ) {
110
- if ( ! this [ kIterator ] . valid ) return this . nextTick ( callback )
110
+ async _next ( ) {
111
+ if ( ! this [ kIterator ] . valid ) return undefined
111
112
112
113
const key = this [ kIterator ] . key
113
- if ( ! this [ kTest ] ( key ) ) return this . nextTick ( callback )
114
+ if ( ! this [ kTest ] ( key ) ) return undefined
114
115
115
116
this [ kIterator ] [ this [ kAdvance ] ] ( )
116
- this . nextTick ( callback , null , key )
117
+ return key
117
118
}
118
119
119
- _nextv ( size , options , callback ) {
120
+ async _nextv ( size , options ) {
120
121
const it = this [ kIterator ]
121
122
const keys = [ ]
122
123
@@ -125,10 +126,10 @@ class MemoryKeyIterator extends AbstractKeyIterator {
125
126
it [ this [ kAdvance ] ] ( )
126
127
}
127
128
128
- this . nextTick ( callback , null , keys )
129
+ return keys
129
130
}
130
131
131
- _all ( options , callback ) {
132
+ async _all ( options ) {
132
133
const size = this . limit - this . count
133
134
const it = this [ kIterator ]
134
135
const keys = [ ]
@@ -138,7 +139,7 @@ class MemoryKeyIterator extends AbstractKeyIterator {
138
139
it [ this [ kAdvance ] ] ( )
139
140
}
140
141
141
- this . nextTick ( callback , null , keys )
142
+ return keys
142
143
}
143
144
}
144
145
@@ -148,19 +149,19 @@ class MemoryValueIterator extends AbstractValueIterator {
148
149
this [ kInit ] ( db [ kTree ] , options )
149
150
}
150
151
151
- _next ( callback ) {
152
- if ( ! this [ kIterator ] . valid ) return this . nextTick ( callback )
152
+ async _next ( options ) {
153
+ if ( ! this [ kIterator ] . valid ) return undefined
153
154
154
155
const key = this [ kIterator ] . key
155
156
const value = this [ kIterator ] . value
156
157
157
- if ( ! this [ kTest ] ( key ) ) return this . nextTick ( callback )
158
+ if ( ! this [ kTest ] ( key ) ) return undefined
158
159
159
160
this [ kIterator ] [ this [ kAdvance ] ] ( )
160
- this . nextTick ( callback , null , value )
161
+ return value
161
162
}
162
163
163
- _nextv ( size , options , callback ) {
164
+ async _nextv ( size , options ) {
164
165
const it = this [ kIterator ]
165
166
const values = [ ]
166
167
@@ -169,10 +170,10 @@ class MemoryValueIterator extends AbstractValueIterator {
169
170
it [ this [ kAdvance ] ] ( )
170
171
}
171
172
172
- this . nextTick ( callback , null , values )
173
+ return values
173
174
}
174
175
175
- _all ( options , callback ) {
176
+ async _all ( options ) {
176
177
const size = this . limit - this . count
177
178
const it = this [ kIterator ]
178
179
const values = [ ]
@@ -182,7 +183,7 @@ class MemoryValueIterator extends AbstractValueIterator {
182
183
it [ this [ kAdvance ] ] ( )
183
184
}
184
185
185
- this . nextTick ( callback , null , values )
186
+ return values
186
187
}
187
188
}
188
189
@@ -270,6 +271,7 @@ class MemoryLevel extends AbstractLevel {
270
271
}
271
272
272
273
// To help migrating from level-mem to abstract-level
274
+ // TODO (v2): remove
273
275
if ( typeof location === 'function' || typeof options === 'function' || typeof _ === 'function' ) {
274
276
throw new ModuleError ( 'The levelup-style callback argument has been removed' , {
275
277
code : 'LEVEL_LEGACY'
@@ -297,39 +299,30 @@ class MemoryLevel extends AbstractLevel {
297
299
this [ kTree ] = createRBT ( compare )
298
300
}
299
301
300
- _put ( key , value , options , callback ) {
302
+ async _put ( key , value , options ) {
301
303
const it = this [ kTree ] . find ( key )
302
304
303
305
if ( it . valid ) {
304
306
this [ kTree ] = it . update ( value )
305
307
} else {
306
308
this [ kTree ] = this [ kTree ] . insert ( key , value )
307
309
}
308
-
309
- this . nextTick ( callback )
310
310
}
311
311
312
- _get ( key , options , callback ) {
313
- const value = this [ kTree ] . get ( key )
314
-
315
- if ( typeof value === 'undefined' ) {
316
- // TODO: use error code (not urgent, abstract-level normalizes this)
317
- return this . nextTick ( callback , new Error ( 'NotFound' ) )
318
- }
319
-
320
- this . nextTick ( callback , null , value )
312
+ async _get ( key , options ) {
313
+ // Is undefined if not found
314
+ return this [ kTree ] . get ( key )
321
315
}
322
316
323
- _getMany ( keys , options , callback ) {
324
- this . nextTick ( callback , null , keys . map ( key => this [ kTree ] . get ( key ) ) )
317
+ async _getMany ( keys , options ) {
318
+ return keys . map ( key => this [ kTree ] . get ( key ) )
325
319
}
326
320
327
- _del ( key , options , callback ) {
321
+ async _del ( key , options ) {
328
322
this [ kTree ] = this [ kTree ] . remove ( key )
329
- this . nextTick ( callback )
330
323
}
331
324
332
- _batch ( operations , options , callback ) {
325
+ async _batch ( operations , options ) {
333
326
let tree = this [ kTree ]
334
327
335
328
for ( const op of operations ) {
@@ -344,38 +337,35 @@ class MemoryLevel extends AbstractLevel {
344
337
}
345
338
346
339
this [ kTree ] = tree
347
- this . nextTick ( callback )
348
340
}
349
341
350
- _clear ( options , callback ) {
342
+ async _clear ( options ) {
351
343
if ( options . limit === - 1 && ! Object . keys ( options ) . some ( isRangeOption ) ) {
352
344
// Delete everything by creating a new empty tree.
353
345
this [ kTree ] = createRBT ( compare )
354
- return this . nextTick ( callback )
346
+ return
355
347
}
356
348
357
349
const iterator = this . _keys ( { ...options } )
358
350
const limit = iterator . limit
359
351
360
352
let count = 0
361
353
362
- const loop = ( ) => {
354
+ while ( true ) {
363
355
// TODO: add option to control "batch size"
364
356
for ( let i = 0 ; i < 500 ; i ++ ) {
365
- if ( ++ count > limit ) return callback ( )
366
- if ( ! iterator [ kIterator ] . valid ) return callback ( )
367
- if ( ! iterator [ kTest ] ( iterator [ kIterator ] . key ) ) return callback ( )
357
+ if ( ++ count > limit ) return
358
+ if ( ! iterator [ kIterator ] . valid ) return
359
+ if ( ! iterator [ kTest ] ( iterator [ kIterator ] . key ) ) return
368
360
369
361
// Must also include changes made in parallel to clear()
370
362
this [ kTree ] = this [ kTree ] . remove ( iterator [ kIterator ] . key )
371
363
iterator [ kIterator ] [ iterator [ kAdvance ] ] ( )
372
364
}
373
365
374
366
// Some time to breathe
375
- this . nextTick ( loop )
367
+ await breathe ( )
376
368
}
377
-
378
- this . nextTick ( loop )
379
369
}
380
370
381
371
_iterator ( options ) {
@@ -393,18 +383,17 @@ class MemoryLevel extends AbstractLevel {
393
383
394
384
exports . MemoryLevel = MemoryLevel
395
385
396
- // Use setImmediate() in Node.js to allow IO in between our callbacks
386
+ let breathe
387
+
388
+ // Use setImmediate() in Node.js to allow IO in between work
397
389
if ( typeof process !== 'undefined' && ! process . browser && typeof global !== 'undefined' && typeof global . setImmediate === 'function' ) {
398
390
const setImmediate = global . setImmediate
399
391
400
- // Automatically applies to iterators, sublevels and chained batches as well
401
- MemoryLevel . prototype . nextTick = function ( fn , ...args ) {
402
- if ( args . length === 0 ) {
403
- setImmediate ( fn )
404
- } else {
405
- setImmediate ( ( ) => fn ( ...args ) )
406
- }
392
+ breathe = function ( ) {
393
+ return new Promise ( setImmediate )
407
394
}
395
+ } else {
396
+ breathe = async function ( ) { }
408
397
}
409
398
410
399
function isRangeOption ( k ) {
0 commit comments