src/utils/index.js

'use strict';

function isNaN( ...n ) {
	return !n.filter( ( _n ) => ( _n === _n ) ).length;
}

function isUndefined( ...n ) {
	return !n.filter( ( _n ) => ( _n !== undefined ) ).length;
}

function isNull( ...n ) {
	return !n.filter( ( _n ) => ( _n !== null ) ).length;
}

function isBoolean( ...n ) {
	return !n.filter( ( _n ) => ( !!_n !== _n ) ).length;
}

function isString( ...n ) {
	return !n.filter( ( _n ) => ( '' + _n !== _n ) ).length;
}

function isNumber( ...n ) {
	return !n.filter( ( _n ) => ( +_n !== _n ) ).length;
}

function isPrimitive( ...n ) {
	return n.filter( ( _n ) => ( isBoolean( _n ) || isString( _n ) || isNumber( _n ) ) ).length === n.length;
}

function isArray( ...n ) {
	return n.filter( ( _n ) => Array.isArray( _n ) ).length === n.length;
}

function isObject( ...n ) {
	return n.filter( ( _n ) => !isArray( _n ) && typeof _n === 'object' ).length === n.length;
}

function isBuffer( ...n ) {
	return n.filter( ( _n ) => Buffer.isBuffer( _n ) ).length === n.length;
}

function isFunction( ...n ) {
	return n.filter( ( _n ) => typeof _n === 'function' ).length === n.length;
}

function isValue( ...n ) {
	return n.filter( ( _n ) => !( isNaN( _n ) || isUndefined( _n ) || isNull( _n ) ) ).length === n.length;
}

/**
 * wait
 * @description
 * similar to <code>usleep</code> in C++
 * @param {milliseconds} t - time to wait
 * @param {*} [v] - optional value to pass through when promise resolves
 * @returns {Promise<any>} - promise to be resolved in [t] milliseconds
 * @example
 * wait( 100, 'hello world' )
 *     .then() // -> will pass 'hello world' in 100ms
 */
function wait( t, v ) {
	if ( !isNumber( t ) ) {
		throw new Error( 'Argument Error - expected number' );
	}

	return new Promise(
		( res ) => setTimeout( () => res( v ), t )
	);
}

/**
 * bytesToSize
 * @description
 * Convert bytes to human readable format
 * @param {bytes} bytes - unit in bytes to parse
 * @returns {string} - pretty string in the format [n unit]
 * @example
 * bytesToSize( 1073741824 ) // -> 1 GB
 */
function bytesToSize( bytes ) {
	if ( !bytes ) {
		return '0 Byte';
	}

	const
		sizes = [ 'Bytes', 'KB', 'MB', 'GB', 'TB' ],
		i     = ~~( Math.log( bytes ) / Math.log( 1024 ) );

	return Math.round( bytes / Math.pow( 1024, i ) ) + ' ' + sizes[ i ];
}

function isPowerOfTwo( n ) {
	return n && !( n & ( n - 1 ) );
}

module.exports = {
	isNaN,
	isUndefined,
	isNull,
	isBoolean,
	isString,
	isNumber,
	isPrimitive,
	isArray,
	isObject,
	isBuffer,
	isFunction,
	isValue,
	wait,
	bytesToSize,
	isPowerOfTwo
};