Skip to content

Commit 60c297d

Browse files
committed
Implement futurify callback-last to future-returning
Closes: #431
1 parent 03802f9 commit 60c297d

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

lib/adapters.js

+15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict';
22

3+
const { Future } = require('./future');
4+
35
// Convert Promise to callback-last
46
// promise <Promise>
57
// callback <Function>
@@ -67,10 +69,23 @@ const promisifySync = fn => (...args) => {
6769
return Promise.resolve(result);
6870
};
6971

72+
// Convert callback contract to Future-returning function
73+
// fn <Function> callback-last function
74+
//
75+
// Returns: <Function> Future-returning function
76+
const futurify = fn => (...args) =>
77+
new Future((resolve, reject) => {
78+
fn(...args, (err, data) => {
79+
if (err) reject(err);
80+
else resolve(data);
81+
});
82+
});
83+
7084
module.exports = {
7185
callbackify,
7286
asyncify,
7387
promiseToCallbackLast,
7488
promisify,
7589
promisifySync,
90+
futurify,
7691
};

test/future.js

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
const { Future } = require('..');
3+
const { Future, futurify } = require('..');
44
const metatests = require('metatests');
55

66
metatests.test('Future map/fork', async test => {
@@ -90,3 +90,37 @@ metatests.test('Future stateless', async test => {
9090

9191
test.end();
9292
});
93+
94+
metatests.test('Future futurify success', async test => {
95+
const f1 = (a, b, callback) => {
96+
if (typeof a !== 'number' || typeof b !== 'number') {
97+
callback(new Error('Arguments must be numbers'));
98+
return;
99+
}
100+
callback(null, a + b);
101+
};
102+
103+
const f2 = futurify(f1);
104+
105+
f2(10, 20).fork(value => {
106+
test.strictSame(value, 30);
107+
test.end();
108+
});
109+
});
110+
111+
metatests.test('Future futurify fail', async test => {
112+
const f1 = (a, b, callback) => {
113+
if (typeof a !== 'number' || typeof b !== 'number') {
114+
callback(new Error('Arguments must be numbers'));
115+
return;
116+
}
117+
callback(null, a + b);
118+
};
119+
120+
const f2 = futurify(f1);
121+
122+
f2('10', '20').fork(test.mustNotCall, error => {
123+
test.strictSame(error.message, 'Arguments must be numbers');
124+
test.end();
125+
});
126+
});

0 commit comments

Comments
 (0)