|
1 | 1 | 'use strict'; |
2 | 2 |
|
3 | | -const poolify = (factory, min, norm, max) => { |
4 | | - const duplicate = (n) => new Array(n).fill().map(() => factory()); |
5 | | - const items = duplicate(norm); |
| 3 | +const poolify = (factory, options, size, max) => { |
| 4 | + const instances = []; |
| 5 | + for (let i = 0; i < size; i++) { |
| 6 | + const instance = factory(...options); |
| 7 | + instances.push(instance); |
| 8 | + } |
6 | 9 |
|
7 | | - return (item) => { |
8 | | - if (item) { |
9 | | - if (items.length < max) { |
10 | | - items.push(item); |
| 10 | + return (instance) => { |
| 11 | + if (instance) { |
| 12 | + if (instances.length < max) { |
| 13 | + instances.push(instance); |
11 | 14 | } |
12 | | - console.log('Recycle item, count =', items.length); |
13 | | - return null; |
14 | | - } |
15 | | - if (items.length < min) { |
16 | | - const instances = duplicate(norm - items.length); |
17 | | - items.push(...instances); |
18 | 15 | } |
19 | | - const res = items.pop(); |
20 | | - console.log('Get from pool, count =', items.length); |
21 | | - return res; |
| 16 | + instance = instances.pop(); |
| 17 | + if (!instance) instance = factory(...options); |
| 18 | + return instance; |
22 | 19 | }; |
23 | 20 | }; |
24 | 21 |
|
25 | 22 | // Usage |
26 | 23 |
|
27 | | -// Factory to allocate 4kb buffer |
28 | | -const buffer = () => new Uint32Array(1024); |
29 | | - |
30 | | -// Allocate pool of 10 buffers |
31 | | -const pool = poolify(buffer, 5, 10, 15); |
32 | | - |
33 | | -let i = 0; |
34 | | - |
35 | | -const next = () => { |
36 | | - const item = pool(); |
37 | | - console.log('Buffer size', item.length * 32); |
38 | | - i++; |
39 | | - if (i < 20) { |
40 | | - setTimeout(next, i * 10); |
41 | | - setTimeout(() => pool(item), i * 100); |
42 | | - } |
43 | | -}; |
| 24 | +const createBuffer = (size) => new Uint8Array(size); |
| 25 | +const pool = poolify(createBuffer, [4096], 10, 15); |
44 | 26 |
|
45 | | -next(); |
| 27 | +const instance = pool(); |
| 28 | +console.log({ instance }); |
| 29 | +pool(instance); |
0 commit comments