| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | 
							- 'use strict';
 
- var $TypeError = require('es-errors/type');
 
- 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://262.ecma-international.org/12.0/#sec-applystringornumericbinaryoperator
 
- // https://262.ecma-international.org/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 (typeof 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 (typeof lprim === 'string' || typeof 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);
 
- 	if (Type(lnum) !== Type(rnum)) {
 
- 		throw new $TypeError('types of ' + lnum + ' and ' + rnum + ' differ');
 
- 	}
 
- 	var Operation = table[opText][typeof lnum === 'bigint' ? 1 : 0];
 
- 	return Operation(lnum, rnum);
 
- };
 
 
  |