-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
/
Copy pathobject-pool.js
87 lines (74 loc) · 1.88 KB
/
object-pool.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
Adapted deePool by Kyle Simpson.
MIT License: http://getify.mit-license.org
*/
var EMPTY_SLOT = Object.freeze(Object.create(null));
// Default object factory.
function defaultObjectFactory () { return {}; }
/**
* Create a new pool.
*/
export function createPool (objectFactory) {
var objPool = [];
var nextFreeSlot = null; // Pool location to look for a free object to use.
objectFactory = objectFactory || defaultObjectFactory;
function use () {
var objToUse;
if (nextFreeSlot === null || nextFreeSlot === objPool.length) {
grow(objPool.length || 5);
}
objToUse = objPool[nextFreeSlot];
objPool[nextFreeSlot++] = EMPTY_SLOT;
clearObject(objToUse);
return objToUse;
}
function recycle (obj) {
if (!(obj instanceof Object)) { return; }
if (nextFreeSlot === null || nextFreeSlot === -1) {
objPool[objPool.length] = obj;
return;
}
objPool[--nextFreeSlot] = obj;
}
function grow (count) {
var currentLength;
var i;
count = count === undefined ? objPool.length : count;
if (count > 0 && nextFreeSlot == null) {
nextFreeSlot = 0;
}
if (count > 0) {
currentLength = objPool.length;
objPool.length += Number(count);
for (i = currentLength; i < objPool.length; i++) {
// Add new obj to pool.
objPool[i] = objectFactory();
}
}
return objPool.length;
}
function size () {
return objPool.length;
}
return {
grow: grow,
pool: objPool,
recycle: recycle,
size: size,
use: use
};
}
export function clearObject (obj) {
var key;
if (!obj || obj.constructor !== Object) { return; }
for (key in obj) { obj[key] = undefined; }
}
export function removeUnusedKeys (obj, schema) {
var key;
if (!obj || obj.constructor !== Object) { return; }
for (key in obj) {
if (!(key in schema)) {
delete obj[key];
}
}
}