Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dist.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module.exports = {
...require('./lib/datetime.js'),
...require('./lib/error.js'),
...require('./lib/events.js'),
...require('./lib/future.js'),
...require('./lib/http.js'),
...require('./lib/objects.js'),
...require('./lib/pool.js'),
Expand Down
67 changes: 67 additions & 0 deletions lib/future.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
'use strict';

class Future {
#executor;

constructor(executor) {
this.#executor = executor;
}

static of(value) {
return new Future((resolve) => resolve(value));
}

chain(fn) {
return new Future((resolve, reject) =>
this.fork(
(value) => fn(value).fork(resolve, reject),
(error) => reject(error),
),
);
}

map(fn) {
return new Future((resolve, reject) =>
this.fork(
(value) =>
new Future((resolve, reject) => {
try {
resolve(fn(value));
} catch (error) {
reject(error);
}
}).fork(resolve, reject),
(error) => reject(error),
),
);
}

fork(successed, failed) {
this.#executor(successed, failed);
}

toPromise() {
const { promise, resolve, reject } = Promise.withResolvers();
this.fork(resolve, reject);
return promise;
}

toThenable() {
const then = (resolve, reject) => {
this.fork(resolve, reject);
};
return { then };
}
}

const futurify =
(fn) =>
(...args) =>
new Future((resolve, reject) => {
fn(...args, (err, data) => {
if (err) reject(err);
else resolve(data);
});
});

module.exports = { Future, futurify };
1 change: 1 addition & 0 deletions metautil.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ module.exports = {
...require('./lib/error.js'),
...require('./lib/events.js'),
...require('./lib/fs.js'),
...require('./lib/future.js'),
...require('./lib/http.js'),
...require('./lib/network.js'),
...require('./lib/objects.js'),
Expand Down