// Array Helpers
const countOccurrences = arr => arr.reduce((prev, curr) => (prev[curr] = ++prev[curr] || 1, prev), {});
const isEmpty = arr => !(Array.isArray(arr) && arr.length > 0 && arr.filter(el => el === undefined).length > 0)
const isEqual = (a, b) => JSON.stringify(a.sort()) === JSON.stringify(b.sort());
const countBy = (arr, prop) => arr.reduce((prev, curr) => (prev[curr[prop]] = ++prev[curr[prop]] || 1, prev), {});
const transpose = matrix => matrix[0].map((col, i) => matrix.map(row => row[i]));

// Dom Helpers
const insertAfter = (ele, anotherEle) => anotherEle.parentNode.insertBefore(ele, anotherEle.nextSibling);
const insertBefore = (ele, anotherEle) => anotherEle.parentNode.insertBefore(ele, anotherEle);
const insertHtmlAfter = (html, ele) => ele.insertAdjacentHTML('afterend', html);
const insertHtmlBefore = (html, ele) => ele.insertAdjacentHTML('beforebegin', html);

const goTo = url => location.href = url;
const replace = (ele, newEle) => ele.parentNode.replaceChild(newEle, ele);
const toNumbers = arr => arr.map(Number);
const wait = async (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));

const capitalize = str => `${str.charAt(0).toUpperCase()}${str.slice(1)}`;
const slugify = string => string.toLowerCase().replace(/\s+/g, '-').replace(/[^\w-]+/g, '');
const isNumeric = str => !/[^0-9]/.test(str);
