| 'use strict'; | 
|   | 
| var GetIntrinsic = require('get-intrinsic'); | 
|   | 
| var $TypeError = GetIntrinsic('%TypeError%'); | 
|   | 
| var HasOwnProperty = require('./HasOwnProperty'); | 
| var ToNumeric = require('./ToNumeric'); | 
| var ToPrimitive = require('./ToPrimitive'); | 
| var ToString = require('./ToString'); | 
| var Type = require('./Type'); | 
|   | 
| var NumberAdd = require('./Number/add'); | 
| var NumberBitwiseAND = require('./Number/bitwiseAND'); | 
| var NumberBitwiseOR = require('./Number/bitwiseOR'); | 
| var NumberBitwiseXOR = require('./Number/bitwiseXOR'); | 
| var NumberDivide = require('./Number/divide'); | 
| var NumberExponentiate = require('./Number/exponentiate'); | 
| var NumberLeftShift = require('./Number/leftShift'); | 
| var NumberMultiply = require('./Number/multiply'); | 
| var NumberRemainder = require('./Number/remainder'); | 
| var NumberSignedRightShift = require('./Number/signedRightShift'); | 
| var NumberSubtract = require('./Number/subtract'); | 
| var NumberUnsignedRightShift = require('./Number/unsignedRightShift'); | 
| var BigIntAdd = require('./BigInt/add'); | 
| var BigIntBitwiseAND = require('./BigInt/bitwiseAND'); | 
| var BigIntBitwiseOR = require('./BigInt/bitwiseOR'); | 
| var BigIntBitwiseXOR = require('./BigInt/bitwiseXOR'); | 
| var BigIntDivide = require('./BigInt/divide'); | 
| var BigIntExponentiate = require('./BigInt/exponentiate'); | 
| var BigIntLeftShift = require('./BigInt/leftShift'); | 
| var BigIntMultiply = require('./BigInt/multiply'); | 
| var BigIntRemainder = require('./BigInt/remainder'); | 
| var BigIntSignedRightShift = require('./BigInt/signedRightShift'); | 
| var BigIntSubtract = require('./BigInt/subtract'); | 
| var BigIntUnsignedRightShift = require('./BigInt/unsignedRightShift'); | 
|   | 
| // https://ecma-international.org/ecma-262/12.0/#sec-applystringornumericbinaryoperator | 
|   | 
| // https://ecma-international.org/ecma-262/12.0/#step-applystringornumericbinaryoperator-operations-table | 
| var table = { | 
|     '**': [NumberExponentiate, BigIntExponentiate], | 
|     '*': [NumberMultiply, BigIntMultiply], | 
|     '/': [NumberDivide, BigIntDivide], | 
|     '%': [NumberRemainder, BigIntRemainder], | 
|     '+': [NumberAdd, BigIntAdd], | 
|     '-': [NumberSubtract, BigIntSubtract], | 
|     '<<': [NumberLeftShift, BigIntLeftShift], | 
|     '>>': [NumberSignedRightShift, BigIntSignedRightShift], | 
|     '>>>': [NumberUnsignedRightShift, BigIntUnsignedRightShift], | 
|     '&': [NumberBitwiseAND, BigIntBitwiseAND], | 
|     '^': [NumberBitwiseXOR, BigIntBitwiseXOR], | 
|     '|': [NumberBitwiseOR, BigIntBitwiseOR] | 
| }; | 
|   | 
| module.exports = function ApplyStringOrNumericBinaryOperator(lval, opText, rval) { | 
|     if (Type(opText) !== 'String' || !HasOwnProperty(table, opText)) { | 
|         throw new $TypeError('Assertion failed: `opText` must be a valid operation string'); | 
|     } | 
|     if (opText === '+') { | 
|         var lprim = ToPrimitive(lval); | 
|         var rprim = ToPrimitive(rval); | 
|         if (Type(lprim) === 'String' || Type(rprim) === 'String') { | 
|             var lstr = ToString(lprim); | 
|             var rstr = ToString(rprim); | 
|             return lstr + rstr; | 
|         } | 
|         /* eslint no-param-reassign: 1 */ | 
|         lval = lprim; | 
|         rval = rprim; | 
|     } | 
|     var lnum = ToNumeric(lval); | 
|     var rnum = ToNumeric(rval); | 
|     var T = Type(lnum); | 
|     if (T !== Type(rnum)) { | 
|         throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ'); | 
|     } | 
|     var Operation = table[opText][T === 'BigInt' ? 1 : 0]; | 
|     return Operation(lnum, rnum); | 
| }; |