From b3950330e3351437f153c6c1debb3821d6e28864 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 8 Dec 2018 12:39:18 +0100 Subject: Create Electron app --- src/renderer/util.ts | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/renderer/util.ts (limited to 'src/renderer/util.ts') diff --git a/src/renderer/util.ts b/src/renderer/util.ts new file mode 100644 index 0000000..cea404b --- /dev/null +++ b/src/renderer/util.ts @@ -0,0 +1,84 @@ +export function recordToMap(r: Record): Map { + const ret = new Map(); + + for (const k of Object.keys(r)) + ret.set(k, r[k]); + + return ret; +} + +export function mapValues(f: (v: V1) => V2, map: Map): Map { + const ret: Map = new Map(); + + for (const [k, v] of map) + ret.set(k, f(v)); + + return ret; +} + +export async function mapValuesAsync(f: (v: V1) => Promise, map: Map): Promise> { + const ret: Map = 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 { + 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 function get(url: string): Promise { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + + const handleError = () => { + if (xhr.readyState !== xhr.DONE) { + reject(new Error('HTTP request ended in state ' + xhr.readyState)); + return; + } + + reject(new Error('HTTP request returned status ' + xhr.status)); + }; + + xhr.addEventListener('error', handleError); + + xhr.addEventListener('load', () => { + if (xhr.readyState !== xhr.DONE || xhr.status !== 200) { + handleError(); + return; + } + + resolve(xhr); + }); + + xhr.open('GET', url, true); + xhr.send(); + }); +} + +export async function getJSON(url: string): Promise { + return JSON.parse((await get(url)).responseText); +} + +export function nextAnimationFrame(): Promise { + return new Promise((resolve) => window.requestAnimationFrame(resolve)); +} -- cgit v1.2.3