// eslint-disable-next-line @typescript-eslint/no-unused-vars type IsTuple = T extends readonly [infer A, ...(infer B)] ? true : false; type MaybeTupleReturn = IsTuple extends true ? (T extends ReadonlyArray ? U : never) : (T extends Array ? U | undefined : never); /** * Picks a random element from an array. * @param array - source array * * @example * sample([1, 2, 3]); // 2 (type: number | undefined) * sample(["a", "b", "c"]); // "c" (type: string | undefined) * sample([]); // undefined (type: undefined) * * const a = [1, 2, 3] as const; * sample(a); // 2 (type: 1 | 2 | 3) * * sample([1, 1, 1] as [number, number, number]); // 1 (type: number) */ const sample = (array: T): MaybeTupleReturn => { return array[Math.floor(Math.random() * array.length)] as MaybeTupleReturn; }; export { sample, };