diff options
Diffstat (limited to 'src/renderer/runtime/util.ts')
-rw-r--r-- | src/renderer/runtime/util.ts | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/renderer/runtime/util.ts b/src/renderer/runtime/util.ts new file mode 100644 index 0000000..5ea0c88 --- /dev/null +++ b/src/renderer/runtime/util.ts @@ -0,0 +1,59 @@ +export function recordToMap<T>(r: Record<string, T>): Map<string, T> { + const ret = new Map(); + + for (const k of Object.keys(r)) + ret.set(k, r[k]); + + return ret; +} + +export function mapValues<K, V1, V2>(f: (v: V1) => V2, map: Map<K, V1>): Map<K, V2> { + const ret: Map<K, V2> = new Map(); + + for (const [k, v] of map) + ret.set(k, f(v)); + + return ret; +} + +export async function mapValuesAsync<K, V1, V2>(f: (v: V1) => Promise<V2>, map: Map<K, V1>): Promise<Map<K, V2>> { + const ret: Map<K, V2> = new Map(); + + for (const [k, v] of mapValues(f, map)) + ret.set(k, await v); + + return ret; +} + +export function nextPowerOf2(n: number): number { + let i = 1; + + while (i < n) + i *= 2; + + return i; +} + +export class Listenable<T extends any[]> { + private readonly listeners: Array<(...args: T) => void> = []; + + public addListener(listener: (...args: T) => void): void { + this.listeners.push(listener); + } + + protected runListeners(...args: T): void { + this.listeners.forEach((l) => l(...args)); + } +} + +export async function getJSON(url: string): Promise<any> { + const res = await window.fetch(url); + if (res.status < 200 || res.status >= 300) + throw new Error(res.statusText); + + return await res.json(); +} + +export function nextAnimationFrame(): Promise<DOMHighResTimeStamp> { + return new Promise((resolve) => window.requestAnimationFrame(resolve)); +} |