import { Component } from "https://esm.sh/preact@10.17.1"; export function isMobile() { return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); } export function setState(component: Component, state: Partial): Promise { return new Promise((resolve) => { component.setState(state, () => { resolve(); }); }); } export function* map(iter: Iterable, mapper: (item: X) => Y) { for (const item of iter) { yield mapper(item); } } export function* filter(iter: Iterable, filterer: (item: X) => boolean) { for (const item of iter) { if (filterer(item)) { yield item; } } } // f should not resolve, if it does resolve, it should only throw an error export async function forever(f: Promise) { const r = await f; if (r == undefined) { throw new Error(`${f} should not resolve`); } throw r; }