You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							43 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							43 lines
						
					
					
						
							1.4 KiB
						
					
					
				// 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; | 
						|
};
 | 
						|
 |