| '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); | 
| }; |