Skip to content

Commit 6d8791c

Browse files
committed
Improved poolify
- Support function instantiation - Optimize returns - Use setImmediate to be async
1 parent 6f4eaf9 commit 6d8791c

1 file changed

Lines changed: 83 additions & 0 deletions

File tree

JavaScript/6-poolify.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
'use strict';
2+
3+
const poolified = Symbol('poolified');
4+
5+
const mixFlag = { [poolified]: true };
6+
7+
const duplicate = (factory, n) => (
8+
new Array(n).fill().map(() => {
9+
const instance = factory();
10+
return Object.assign(instance, mixFlag);
11+
})
12+
);
13+
14+
const provide = callback => item => {
15+
setImmediate(() => {
16+
callback(item);
17+
});
18+
};
19+
20+
const poolify = (factory, min, norm, max) => {
21+
let allocated = norm;
22+
const pool = (par) => {
23+
if (par[poolified]) {
24+
const delayed = pool.delayed.shift();
25+
if (delayed) delayed(par);
26+
else pool.items.push(par);
27+
return;
28+
}
29+
const callback = provide(par);
30+
if (pool.items.length < min && allocated < max) {
31+
const grow = Math.min(max - allocated, norm - pool.items.length);
32+
allocated += grow;
33+
const items = duplicate(factory, grow);
34+
pool.items.push(...items);
35+
}
36+
const res = pool.items.pop();
37+
if (res) callback(res);
38+
else pool.delayed.push(callback);
39+
};
40+
return Object.assign(pool, {
41+
items: duplicate(factory, norm),
42+
delayed: []
43+
});
44+
};
45+
46+
// Usage
47+
48+
const adder = a => b => adder(a + b);
49+
50+
const pool = poolify(adder, 1, 2, 3);
51+
52+
console.log('request Item1');
53+
pool(item1 => {
54+
console.log('get Item1');
55+
console.log('request Item2');
56+
pool(item2 => {
57+
console.log('get Item2');
58+
console.log('request Item3');
59+
pool(item3 => {
60+
console.log('get Item3');
61+
setTimeout(() => {
62+
pool(item3);
63+
console.log('recycle Item3');
64+
}, 50);
65+
});
66+
console.log('request Item4');
67+
pool(item4 => {
68+
console.log('get Item4');
69+
setTimeout(() => {
70+
pool(item4);
71+
console.log('recycle Item4');
72+
}, 20);
73+
});
74+
setTimeout(() => {
75+
pool(item1);
76+
console.log('recycle Item1');
77+
setTimeout(() => {
78+
pool(item2);
79+
console.log('recycle Item2');
80+
}, 10);
81+
}, 10);
82+
});
83+
});

0 commit comments

Comments
 (0)