From f4acb0e1226b63d789a129b7ae088e8fb5165473 Mon Sep 17 00:00:00 2001 From: Kris Zyp Date: Tue, 23 Jan 2024 09:21:08 -0700 Subject: [PATCH] Add support for asynchronous iteration with flatMap --- package.json | 2 +- util/RangeIterable.js | 31 ++++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index eecd88bf3..f9e08e805 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "lmdb", "author": "Kris Zyp", - "version": "2.9.3-beta.5-debug", + "version": "2.10.0-beta.1", "description": "Simple, efficient, scalable, high-performance LMDB interface", "license": "MIT", "repository": { diff --git a/util/RangeIterable.js b/util/RangeIterable.js index ce2bf6fd4..ab1c121d2 100644 --- a/util/RangeIterable.js +++ b/util/RangeIterable.js @@ -173,21 +173,46 @@ export class RangeIterable { let isFirst = true; let currentSubIterator; return { - next() { + next(resolvedResult) { try { do { if (currentSubIterator) { - let result = currentSubIterator.next(); + let result; + if (resolvedResult) { + result = resolvedResult; + resolvedResult = undefined; + } else result = currentSubIterator.next(); + if (result.then) { + if (!async) throw new Error('Can not synchronously iterate with asynchronous values'); + return result.then((result) => this.next(result)); + } if (!result.done) { return result; } } - let result = iterator.next(); + let result = resolvedResult ?? iterator.next(); + if (result.then) { + if (!async) throw new Error('Can not synchronously iterate with asynchronous values'); + currentSubIterator = undefined; + return result.then((result) => this.next(result)); + } if (result.done) { if (mappedIterable.onDone) mappedIterable.onDone(); return result; } let value = callback(result.value); + if (value?.then) { + if (!async) throw new Error('Can not synchronously iterate with asynchronous values'); + return value.then((value) => { + if (Array.isArray(value) || value instanceof RangeIterable) { + currentSubIterator = value[Symbol.iterator](); + return this.next(); + } else { + currentSubIterator = null; + return { value }; + } + }) + } if (Array.isArray(value) || value instanceof RangeIterable) currentSubIterator = value[Symbol.iterator](); else {