import { compact, flattenDeep, isEqual } from 'lodash' export const arrify = (maybeArr: T | T[]) => Array.isArray(maybeArr) ? maybeArr : [maybeArr] export function filterDefined(array: (T | null | undefined)[]) { return array.filter((item) => item !== null && item !== undefined) as T[] } type Falsey = false | undefined | null | 0 | '' type FalseyValueArray = T | Falsey | FalseyValueArray[] export function buildArray(...params: FalseyValueArray[]) { return compact(flattenDeep(params)) as T[] } export function groupConsecutive(xs: T[], key: (x: T) => U) { if (!xs.length) { return [] } const result = [] let curr = { key: key(xs[0]), items: [xs[0]] } for (const x of xs.slice(1)) { const k = key(x) if (!isEqual(k, curr.key)) { result.push(curr) curr = { key: k, items: [x] } } else { curr.items.push(x) } } result.push(curr) return result }