import { isArray, isDefined } from './Is'; import { on, use } from './Constructor'; export type OneOrMore = T | Array; export type ArrayLike = OneOrMore[]; export const toArray = (...items: ArrayLike): T[] => items.length > 1 ? (items as T[]) : isArray(items[0]) ? items[0] : isDefined(items[0]) ? [items[0]] : []; export const toObject = (key: keyof T, ...items: ArrayLike): Record => toArray(...items).reduce((o: any, i) => { o[i[key]] = i; return o; }, {}); export const array = { merge: (first: any[] = [], second: any[] = [], firstKey = 'id', secondKey = 'id'): any[] => first.map(f => ({ ...f, ...second.find(s => isDefined(s[secondKey]) && isDefined(f[firstKey]) && s[secondKey] === f[firstKey]), })), switch: (items: T[] = [], item: T): T[] => use([...items], res => { on(res.indexOf(item), i => (i !== -1 ? res.splice(i, 1) : res.push(item))); return res; }), splitIn: (items: T[] = [], length = 2): T[][] => { const res: T[][] = Array.from({ length }, () => []); items.forEach((i, index) => res[index % length].push(i)); return res; }, chunk: (items: T[] = [], length = 2): T[][] => { const chunks = Math.ceil(items.length / length); const res: T[][] = Array.from({ length: chunks }, () => []); items.forEach((i, index) => res[Math.floor(index / chunks)].push(i)); return res; }, };