From c2d25106df806fd9de96f1ab3186102ba27dceab Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Sun, 29 Aug 2021 17:18:37 +0100 Subject: Promises --- src/ffi.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/ffi.js') diff --git a/src/ffi.js b/src/ffi.js index 07e7b0f..450f5e3 100644 --- a/src/ffi.js +++ b/src/ffi.js @@ -64,3 +64,33 @@ export function type_of(value) { export function get_symbol(name) { return Symbol.for(name); } + +// A wrapper around a promise to prevent `Promise>` collapsing into +// `Promise`. +class PromiseLayer { + constructor(promise) { + this.promise = promise; + } + + static wrap(value) { + return value instanceof Promise ? new PromiseLayer(value) : value; + } + + static unwrap(value) { + return value instanceof PromiseLayer ? value.promise : value; + } +} + +export function resolve(value) { + return Promise.resolve(PromiseLayer.wrap(value)); +} + +export function then(promise, fn) { + return promise.then((value) => fn(PromiseLayer.unwrap(value))); +} + +export function map_promise(promise, fn) { + return promise.then((value) => + PromiseLayer.wrap(fn(PromiseLayer.unwrap(value))) + ); +} -- cgit v1.2.3