UNPKG

ds-algo-study

Version:

Just experimenting with publishing a package

163 lines (151 loc) 3.1 kB
/** * Helpers. */ var s = 1000; var m = s * 60; var h = m * 60; var d = h * 24; var w = d * 7; var y = d * 365.25; /** * Parse or format the given `val`. * * Options: * * - `long` verbose formatting [false] * * @param {String|Number} val * @param {Object} [options] * @throws {Error} throw an error if val is not a non-empty string or a number * @return {String|Number} * @api public */ module.exports = function ( val, options ) { options = options || {}; var type = typeof val; if ( type === 'string' && val.length > 0 ) { return parse( val ); } else if ( type === 'number' && isFinite( val ) ) { return options.long ? fmtLong( val ) : fmtShort( val ); } throw new Error( 'val is not a non-empty string or a valid number. val=' + JSON.stringify( val ) ); }; /** * Parse the given `str` and return milliseconds. * * @param {String} str * @return {Number} * @api private */ function parse( str ) { str = String( str ); if ( str.length > 100 ) { return; } var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( str ); if ( !match ) { return; } var n = parseFloat( match[ 1 ] ); var type = ( match[ 2 ] || 'ms' ).toLowerCase(); switch ( type ) { case 'years': case 'year': case 'yrs': case 'yr': case 'y': return n * y; case 'weeks': case 'week': case 'w': return n * w; case 'days': case 'day': case 'd': return n * d; case 'hours': case 'hour': case 'hrs': case 'hr': case 'h': return n * h; case 'minutes': case 'minute': case 'mins': case 'min': case 'm': return n * m; case 'seconds': case 'second': case 'secs': case 'sec': case 's': return n * s; case 'milliseconds': case 'millisecond': case 'msecs': case 'msec': case 'ms': return n; default: return undefined; } } /** * Short format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function fmtShort( ms ) { var msAbs = Math.abs( ms ); if ( msAbs >= d ) { return Math.round( ms / d ) + 'd'; } if ( msAbs >= h ) { return Math.round( ms / h ) + 'h'; } if ( msAbs >= m ) { return Math.round( ms / m ) + 'm'; } if ( msAbs >= s ) { return Math.round( ms / s ) + 's'; } return ms + 'ms'; } /** * Long format for `ms`. * * @param {Number} ms * @return {String} * @api private */ function fmtLong( ms ) { var msAbs = Math.abs( ms ); if ( msAbs >= d ) { return plural( ms, msAbs, d, 'day' ); } if ( msAbs >= h ) { return plural( ms, msAbs, h, 'hour' ); } if ( msAbs >= m ) { return plural( ms, msAbs, m, 'minute' ); } if ( msAbs >= s ) { return plural( ms, msAbs, s, 'second' ); } return ms + ' ms'; } /** * Pluralization helper. */ function plural( ms, msAbs, n, name ) { var isPlural = msAbs >= n * 1.5; return Math.round( ms / n ) + ' ' + name + ( isPlural ? 's' : '' ); }