Skip to content

Commit

Permalink
Add Future implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
tshemsedinov committed Nov 29, 2024
1 parent 3be2d44 commit 2d01a07
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 0 deletions.
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
63 changes: 63 additions & 0 deletions lib/future.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
'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);
}

promise() {
return new Promise((resolve, reject) => {
this.fork(
(value) => resolve(value),
(error) => reject(error),
);
});
}
}

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

0 comments on commit 2d01a07

Please sign in to comment.