import {mapObj} from './funky.js'; export function noop() {}; // hypotenuse factor of isoscelese right triangle export const sqrt2 = Math.sqrt(2); // short width factor given the lenght of a hexagon's side // (2*S gives long width) export const sqrt3 = Math.sqrt(3); export function throttleEvent(type, name, obj) { obj = obj || window; let running = false; let throttle = () => { if (!running) { running = true; requestAnimationFrame(() => { obj.dispatchEvent(new CustomEvent(name)); running = false; }); } } obj.addEventListener(type, throttle); } throttleEvent('resize', 'optimizedResize'); export function clone(obj) { return JSON.parse(JSON.stringify(obj)); } export function has(obj, prop) { return obj && obj.hasOwnProperty(prop); } export function hypotenuse(a, b) { if (b == null) b = a; return Math.sqrt(a*a + b*b); } export function random(min, max) { if (Array.isArray(min)) { return min[random(min.length - 1)]; } if (typeof min === 'object') { return min[random(Object.keys(min))]; } if (max == null) { max = min; min = 0; } return min + Math.floor(Math.random() * (max - min + 1)); } export function range (start, end) { if (end == null) { end = start; start = 0; } if (start > end) { const swap = start; start = end; end = swap; } return Array.from(Array(Math.abs(end - start)), (_value, index) => index + start); } export function rangeInclusive(start, end) { if (end == null) { end = start; start = 0; } return range(Math.min(start, end), Math.max(start, end)+1); } export function getQueryStringParameters (queryString = document.location.search, separator = '&', assignment = '=') { let parameters = {}; queryString .replace(/(^\?)/,'') .split(separator) .forEach(pair => { pair = pair.split(assignment); parameters[pair[0]] = pair[1]; }); return parameters; } export function getQueryStringObj (queryString = document.location.search, separator = '&', assignment = '=') { return mapObj(getQueryStringParameters(queryString, separator, assignment), parseString); } const braced = /^{.*}$/; const bracketed = /^\[.*\]$/; export function parseString (str) { return typeof str !== 'string' ? str : str.toLowerCase() === 'true' ? true : str.toLowerCase() === 'false' ? false : str.toLowerCase() === 'null' ? null : str.toLowerCase() === 'undefined' ? undefined : !isNaN(Number(str)) ? Number(str) : braced.test(str) || bracketed.test(str) ? JSON.parse(decodeURIComponent(str)) : str; } export function toFixed(number, precision = 3, fallback = NaN) { return typeof number === 'number' && !isNaN(number) ? Number(number.toFixed(precision)) : fallback; }