--- /dev/null
+// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`
+var Map = require('../modules/es.map');
+var WeakMap = require('../modules/es.weak-map');
+var create = require('../internals/object-create');
+var isObject = require('../internals/is-object');
+
+var Node = function () {
+ // keys
+ this.object = null;
+ this.symbol = null;
+ // child nodes
+ this.primitives = null;
+ this.objectsByIndex = create(null);
+};
+
+Node.prototype.get = function (key, initializer) {
+ return this[key] || (this[key] = initializer());
+};
+
+Node.prototype.next = function (i, it, IS_OBJECT) {
+ var store = IS_OBJECT
+ ? this.objectsByIndex[i] || (this.objectsByIndex[i] = new WeakMap())
+ : this.primitives || (this.primitives = new Map());
+ var entry = store.get(it);
+ if (!entry) store.set(it, entry = new Node());
+ return entry;
+};
+
+var root = new Node();
+
+module.exports = function () {
+ var active = root;
+ var length = arguments.length;
+ var i, it;
+ // for prevent leaking, start from objects
+ for (i = 0; i < length; i++) {
+ if (isObject(it = arguments[i])) active = active.next(i, it, true);
+ }
+ if (this === Object && active === root) throw TypeError('Composite keys must contain a non-primitive component');
+ for (i = 0; i < length; i++) {
+ if (!isObject(it = arguments[i])) active = active.next(i, it, false);
+ } return active;
+};