Skip to content

Commit 7ddef45

Browse files
committed
Add Future implementation
1 parent d90f5ea commit 7ddef45

3 files changed

Lines changed: 65 additions & 0 deletions

File tree

dist.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module.exports = {
66
...require('./lib/datetime.js'),
77
...require('./lib/error.js'),
88
...require('./lib/events.js'),
9+
...require('./lib/future.js'),
910
...require('./lib/http.js'),
1011
...require('./lib/objects.js'),
1112
...require('./lib/pool.js'),

lib/future.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
'use strict';
2+
3+
class Future {
4+
#executor;
5+
6+
constructor(executor) {
7+
this.#executor = executor;
8+
}
9+
10+
static of(value) {
11+
return new Future((resolve) => resolve(value));
12+
}
13+
14+
chain(fn) {
15+
return new Future((resolve, reject) =>
16+
this.fork(
17+
(value) => fn(value).fork(resolve, reject),
18+
(error) => reject(error),
19+
),
20+
);
21+
}
22+
23+
map(fn) {
24+
return new Future((resolve, reject) =>
25+
this.fork(
26+
(value) =>
27+
new Future((resolve, reject) => {
28+
try {
29+
resolve(fn(value));
30+
} catch (error) {
31+
reject(error);
32+
}
33+
}).fork(resolve, reject),
34+
(error) => reject(error),
35+
),
36+
);
37+
}
38+
39+
fork(successed, failed) {
40+
this.#executor(successed, failed);
41+
}
42+
43+
promise() {
44+
return new Promise((resolve, reject) => {
45+
this.fork(
46+
(value) => resolve(value),
47+
(error) => reject(error),
48+
);
49+
});
50+
}
51+
}
52+
53+
const futurify =
54+
(fn) =>
55+
(...args) =>
56+
new Future((resolve, reject) => {
57+
fn(...args, (err, data) => {
58+
if (err) reject(err);
59+
else resolve(data);
60+
});
61+
});
62+
63+
module.exports = { Future, futurify };

metautil.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module.exports = {
99
...require('./lib/error.js'),
1010
...require('./lib/events.js'),
1111
...require('./lib/fs.js'),
12+
...require('./lib/future.js'),
1213
...require('./lib/http.js'),
1314
...require('./lib/network.js'),
1415
...require('./lib/objects.js'),

0 commit comments

Comments
 (0)