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.
		
		
		
		
			
				
					41 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					41 lines
				
				1.3 KiB
			| 
											11 months ago
										 | 'use strict'; | ||
|  | var aCallable = require('../internals/a-callable'); | ||
|  | var anObject = require('../internals/an-object'); | ||
|  | var call = require('../internals/function-call'); | ||
|  | var toIntegerOrInfinity = require('../internals/to-integer-or-infinity'); | ||
|  | var getIteratorDirect = require('../internals/get-iterator-direct'); | ||
|  | 
 | ||
|  | var INVALID_SIZE = 'Invalid size'; | ||
|  | var $RangeError = RangeError; | ||
|  | var $TypeError = TypeError; | ||
|  | var max = Math.max; | ||
|  | 
 | ||
|  | var SetRecord = function (set, intSize) { | ||
|  |   this.set = set; | ||
|  |   this.size = max(intSize, 0); | ||
|  |   this.has = aCallable(set.has); | ||
|  |   this.keys = aCallable(set.keys); | ||
|  | }; | ||
|  | 
 | ||
|  | SetRecord.prototype = { | ||
|  |   getIterator: function () { | ||
|  |     return getIteratorDirect(anObject(call(this.keys, this.set))); | ||
|  |   }, | ||
|  |   includes: function (it) { | ||
|  |     return call(this.has, this.set, it); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | // `GetSetRecord` abstract operation
 | ||
|  | // https://tc39.es/proposal-set-methods/#sec-getsetrecord
 | ||
|  | module.exports = function (obj) { | ||
|  |   anObject(obj); | ||
|  |   var numSize = +obj.size; | ||
|  |   // NOTE: If size is undefined, then numSize will be NaN
 | ||
|  |   // eslint-disable-next-line no-self-compare -- NaN check
 | ||
|  |   if (numSize !== numSize) throw new $TypeError(INVALID_SIZE); | ||
|  |   var intSize = toIntegerOrInfinity(numSize); | ||
|  |   if (intSize < 0) throw new $RangeError(INVALID_SIZE); | ||
|  |   return new SetRecord(obj, intSize); | ||
|  | }; |