export const indempotent = unknown>( action: T ): T => { let called = false; let result: ReturnType | undefined = undefined; return ((...args: Parameters) => { if (called) { return result; } else { result = action(...args) as ReturnType; called = true; return result; } }) as T; }; export const eventOn = ( target: EventTarget, eventName: string ): Promise => new Promise((resolve) => { const handler = (event: Event): void => { target.removeEventListener(eventName, handler); resolve(event); }; target.addEventListener(eventName, handler); }); export const timeout = (ms: number): Promise => new Promise((resolve) => { setTimeout(resolve, ms); });