export type PartialBy = Omit & Partial>; export type Writable = T extends object ? { -readonly [K in keyof T]: Writable } : T; export function iteratorConverter(generator: Generator): IterableIterator { return { [Symbol.iterator](): IterableIterator { return this; }, next(): IteratorResult { return generator.next(); }, }; } export function asyncIteratorConverter(generator: AsyncGenerator): AsyncIterableIterator { return { [Symbol.asyncIterator](): AsyncIterableIterator { return this; }, next(): Promise> { return generator.next(); }, }; } export function isValidUuid(str: string): boolean { const regexp = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i; return regexp.test(str); } export function getAverage(arr: number[], defaultAvgIfArrLengthIs0 = 0): number { if (arr.length === 0) return defaultAvgIfArrLengthIs0; return arr.reduce((a, b) => a + b, 0) / arr.length; } export function getMedian(arr: number[], copyArrayForSorting = true): number { // Sort the array in ascending order const sortedArr = copyArrayForSorting ? arr.slice().sort((a, b) => a - b) : arr.sort((a, b) => a-b) ; // Calculate the middle index const mid = Math.floor(sortedArr.length / 2); // If the array length is odd, return the middle element if (sortedArr.length % 2 !== 0) { return sortedArr[mid]; } // If the array length is even, return the average of the two middle elements return (sortedArr[mid - 1] + sortedArr[mid]) / 2; } export function parseJsonAs(json?: string): T | undefined { if (!json) { return undefined; } try { return JSON.parse(json) as T; } catch (error) { return undefined; } }