export function assertExhaustive(x: never): never { throw new Error("Unexpected object: " + x); } export async function tryCatch( promise: Promise | undefined ): Promise<[null, T] | [E, null]> { if (!promise) { return [null, undefined as T]; } try { const data = await promise; return [null, data]; } catch (error) { return [error as E, null]; } } export type Deferred = { promise: Promise; resolve: (value: T) => void; reject: (reason?: any) => void; }; export function promiseWithResolvers(): Deferred { let resolve!: (value: T) => void; let reject!: (reason?: any) => void; const promise = new Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; }); return { promise, resolve, reject, }; }