Spaces:
Runtime error
Runtime error
/* eslint max-statements: 0 */ | |
; | |
var indexOf = require("es5-ext/array/#/e-index-of"); | |
var create = Object.create; | |
module.exports = function () { | |
var lastId = 0, map = [], cache = create(null); | |
return { | |
get: function (args) { | |
var index = 0, set = map, i, length = args.length; | |
if (length === 0) return set[length] || null; | |
if ((set = set[length])) { | |
while (index < length - 1) { | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) return null; | |
set = set[1][i]; | |
++index; | |
} | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) return null; | |
return set[1][i] || null; | |
} | |
return null; | |
}, | |
set: function (args) { | |
var index = 0, set = map, i, length = args.length; | |
if (length === 0) { | |
set[length] = ++lastId; | |
} else { | |
if (!set[length]) { | |
set[length] = [[], []]; | |
} | |
set = set[length]; | |
while (index < length - 1) { | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) { | |
i = set[0].push(args[index]) - 1; | |
set[1].push([[], []]); | |
} | |
set = set[1][i]; | |
++index; | |
} | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) { | |
i = set[0].push(args[index]) - 1; | |
} | |
set[1][i] = ++lastId; | |
} | |
cache[lastId] = args; | |
return lastId; | |
}, | |
delete: function (id) { | |
var index = 0, set = map, i, args = cache[id], length = args.length, path = []; | |
if (length === 0) { | |
delete set[length]; | |
} else if ((set = set[length])) { | |
while (index < length - 1) { | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) { | |
return; | |
} | |
path.push(set, i); | |
set = set[1][i]; | |
++index; | |
} | |
i = indexOf.call(set[0], args[index]); | |
if (i === -1) { | |
return; | |
} | |
id = set[1][i]; | |
set[0].splice(i, 1); | |
set[1].splice(i, 1); | |
while (!set[0].length && path.length) { | |
i = path.pop(); | |
set = path.pop(); | |
set[0].splice(i, 1); | |
set[1].splice(i, 1); | |
} | |
} | |
delete cache[id]; | |
}, | |
clear: function () { | |
map = []; | |
cache = create(null); | |
} | |
}; | |
}; | |