function arrayMin( array ) { if ( array.length === 0 ) return Infinity; let min = array[ 0 ]; for ( let i = 1, l = array.length; i < l; ++ i ) { if ( array[ i ] < min ) min = array[ i ]; } return min; } function arrayMax( array ) { if ( array.length === 0 ) return - Infinity; let max = array[ 0 ]; for ( let i = 1, l = array.length; i < l; ++ i ) { if ( array[ i ] > max ) max = array[ i ]; } return max; } const TYPED_ARRAYS = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: Uint8ClampedArray, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array }; function getTypedArray( type, buffer ) { return new TYPED_ARRAYS[ type ]( buffer ); } function createElementNS( name ) { return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); } /** * cyrb53 hash for string from: https://stackoverflow.com/a/52171480 * * Public Domain, @bryc - https://stackoverflow.com/users/815680/bryc * * It is roughly similar to the well-known MurmurHash/xxHash algorithms. It uses a combination * of multiplication and Xorshift to generate the hash, but not as thorough. As a result it's * faster than either would be in JavaScript and significantly simpler to implement. Keep in * mind this is not a secure algorithm, if privacy/security is a concern, this is not for you. * * @param {string} str * @param {number} seed, default 0 * @returns number */ function hashString( str, seed = 0 ) { let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; for ( let i = 0, ch; i < str.length; i ++ ) { ch = str.charCodeAt( i ); h1 = Math.imul( h1 ^ ch, 2654435761 ); h2 = Math.imul( h2 ^ ch, 1597334677 ); } h1 = Math.imul( h1 ^ ( h1 >>> 16 ), 2246822507 ) ^ Math.imul( h2 ^ ( h2 >>> 13 ), 3266489909 ); h2 = Math.imul( h2 ^ ( h2 >>> 16 ), 2246822507 ) ^ Math.imul( h1 ^ ( h1 >>> 13 ), 3266489909 ); return 4294967296 * ( 2097151 & h2 ) + ( h1 >>> 0 ); } export { arrayMin, arrayMax, getTypedArray, createElementNS, hashString };