Source: Number.js

'use strict';
if ( ( 0, eval )( 'this' ).XtraUtils && ( 0, eval )( 'this' ).XtraUtils.Utility ) {
	/**
	 * @type {Utility}
	 * @property {function} aidsIn The Number class
	 * @property {Object} aidsIn.prototype the Number prototype
	 * @namespace
	 * @memberof XtraUtils
	 */
	XtraUtils.Number = new XtraUtils.Utility( Number );

	const { toString } = 0,
		{ floor, pow } = Math.floor;

	XtraUtils.Number.addMethod( 'clamp', ( function(){
		/**
		 * Clamps a number to a range.
		 * @param {number} number The number to clamp.
		 * @param {number} min The minimum of the range.
		 * @param {number} max The maximum of the range.
		 * @returns {number} The clamped number.
		 * @memberof XtraUtils.Number.
		 */
		function clamp( number, min, max ) {
			return number | 0 > max|0 ? max|0 : number | 0 < min|0 ? min|0 : number|0;
		}
	} )() );

	XtraUtils.Number.addMethod( 'ratio', ( function(){
		const gcf = ( a,b )=>{a = Number( a );return( b = Number( b ) ) ? gcf( b,a % b ) : a;};
		/**
		 * Turns the number into a ratio based on an argument.
		 * @param {number} a The first number.
		 * @param {number} b The number to use as the second part of the ratio.
		 * @returns {string} The resulting ratio.
		 * @memberof XtraUtils.Number.
		 * @example
		 * // returns "2:1"
		 * let num = 2;
		 * num.ratio(1);
		 * @example
		 * // returns "2:1"
		 * let num = 10;
		 * num.ratio(5);
		 */
		function ratio( a, b ) {
			let GCF = gcf( a|0, b|0 );
			return `${a / GCF}:${b / GCF}`;
		}
		return ratio;
	} )() );

	XtraUtils.Number.addMethod( 'factorial', ( function(){
		function factorial( n ) {
			let f = 1;
			for( let i = f; i <= n|0; i++ ) {
				f *= i;
			}
			return f;
		}
	} )() );
	XtraUtils.Number.addMethod( 'gcf', ( function(){
		const _gcf = ( a,b ) => {a = Number( a );return( b = Number( b ) ) ? _gcf( b,a % b ) : a;};
		/**
		 * Returns the GCF (**G**reatest **C**ommon **F**actor) of two numbers.
		 * @param {number} a The first number.
		 * @param {number} b The second number.
		 * @returns {number} The GCF
		 * @memberof XtraUtils.Number.
		 * @example
		 * // returns 1
		 * Number.gcf(10, 3);
		 * @example
		 * // returns 2
		 * Number.gcf(4, 2);
		 */
		function gcf( a, b ) {
			if ( !b ) {
				return a|0;
			}
			return _gcf( b|0, a | 0 % b|0 );
		}
		return gcf;
	} )() );

	XtraUtils.Number.addMethod( 'lcm', ( function(){
		const _gcf = ( a,b ) => {a = Number( a );return( b = Number( b ) ) ? _gcf( b,a % b ) : a;};
		/**
		 * Gets the LCM (**L**east **C**ommon **M**ultiple) of two numbers.
		 * @param {number} a The first number.
		 * @param {number} b The second number.
		 * @returns {number} The LCM.
		 * @memberof XtraUtils.Number.
		 * @example
		 * // returns 6
		 * Number.lcm(2,3);
		 */
		function lcm( a,b ) {
			return a | 0 * b | 0 / _gcf( a, b )|0;
		}
		return lcm;
	} )() );

	XtraUtils.Number.addUtil( 'map', ( function(){
		/**
		 * Maps a number between ranges.
		 * @param {number} in_min The minimum of the input range.
		 * @param {number} in_max The maximum of the input range.
		 * @param {number} out_min The minimum of the output range.
		 * @param {number} out_max The maximum of the output range.
		 * @returns {number} The resulting number.
		 * @memberof XtraUtils.Number#
		 */
		function map( in_min, in_max, out_min, out_max ) {
			return ( this - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min;
		}
		return map;
	} )() );



	XtraUtils.Number.addUtil( 'toBaseN', ( function() {
		/**
		 * Returns the number in base `n`
		 * @param {number} [n=10] The base to output the number in.
		 * @returns {string} The number in base N.
		 * @memberof XtraUtils.Number#
		 */
		function toBaseN( n = 10 ) {
			return toString.call( parseInt( toString.call( this ), 10 ), n );
		}
		return toBaseN;
	} )() );

	XtraUtils.Number.addUtil( 'toPlaceN', ( function() {
		/**
		 * Returns the number truncated at the `n`th decimal place.
		 * @param {number} n The decimal place to truncate it to.
		 * @returns {number} The number trucated to place `n`
		 * @memberof XtraUtils.Number#
		 */
		function toPlaceN( n ) {
			const exponent = pow( 10, n );
			return floor( this * exponent ) / exponent;
		}
		return toPlaceN;
	} )() );

	XtraUtils.Number.addUtil( 'pow', ( function(){
		const _pow = ( a,b )=>Math.pow( a,b );
		/**
		 * Returns the number to the `n`th power.
		 * @param {number} n The power.
		 * @returns {number} The number to the `n`th power.
		 * @memberof XtraUtils.Number#
		 */
		function pow( n ) {
			return _pow( this, n );
		}
		return pow;
	} )() );

	XtraUtils.Number.addUtil( 'ceil', ( function() {
		/**
		 * Rounds the number up.
		 * @returns {number} The number rounded up.
		 * @memberof XtraUtils.Number#
		 */
		function ceil(){
			return Math.ceil( this );
		}
		return ceil;
	} )() );

	XtraUtils.Number.addUtil( 'floor', ( function(){
		/**
		 * Rounds the number down.
		 * @returns {number} The number rounded down.
		 * @memberof XtraUtils.Number#
		 * @example
		 * // returns 5
		 * let num = 5.9
		 * num.floor();
		 */
		function floor() {
			return Math.floor( this );
		}
		return floor;
	} )() );

	XtraUtils.Number.addUtil( 'sqrt', ( function(){
		/**
		 * Finds the square root of the number.
		 * @returns {number} The sqaure root of the number.
		 * @memberof XtraUtils.Number#
		 * @example
		 * // returns 5
		 * let num = 25;
		 * num.sqrt();
		 */
		function sqrt() {
			return Math.sqrt( this );
		}
		return sqrt;
	} )() );

	XtraUtils.Number.addUtil( 'toOrdinal', ( function(){
		const _ = [, 'st', 'nd', 'rd'];
		/**
		 * Returns the number in it's ordinal form.
		 * @returns {number} The ordinal form of the number.
		 * @memberof XtraUtils.Number#
		 * @example
		 * // returns "5th"
		 * let num = 5;
		 * num.toOrdinal();
		 */
		function toOrdinal() {
			return this + ( _[/1?.$/.exec( this )] || 'th' );
		}
		return toOrdinal;
	} )() );

	XtraUtils.Number.addUtil( 'modulo', ( function(){
		/**
		 * Returns modulo of the number
		 * @param {number} number The number to use modulo with.
		 * @returns {number} The resulting modulo.
		 * @memberof XtraUtils.Number#
		 * @example
		 * // returns 1
		 * let num = 5;
		 * num.modulo(2);
		 */
		function modulo( number ){
			var modulo = this % number|0;
			return modulo < 0 ? modulo + number : modulo;
		}
		return modulo;
	} )() );

	XtraUtils.Number.addUtil( 'needsPromotion', ( function(){
		const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER;
		/**
		 * Whether the number is greater than the maximum allowed number
		 * @returns {boolean} Whether the number is too large.
		 * @memberof XtraUtils.Number#
		 * @example
		 * // returns false
		 * let num = 5;
		 * num.needsPromotion();
		 * @example
		 * // returns true
		 * let num = Number.MAX_SAFE_INTEGER + 2;
		 * num.needsPromotion();
		 */
		function needsPromotion() {
			return this > MAX_SAFE_INTEGER;
		}
		return needsPromotion;
	} )() );

} else {
	throw Error( 'XtraUtils is not defined, or XtraUtils.Number is not a valid instance.' +
							 'You must include the base for XtraUtils, and XtraUtils.Number must be ' +
							 'an instance of XtraUtils.Utility. For more details, please visit ' +
							 'https://github.com/FreezePhoenix/XtraUtils/. If your issue still occurs, submit an issue here:' +
							 'https://github.com/FreezePhoenix/XtraUtils/issues/new' );
}