2024-03-15 13:44:17 +00:00
|
|
|
import { Component } from "https://esm.sh/preact@10.17.1";
|
|
|
|
|
2023-11-21 04:06:13 +00:00
|
|
|
export function isMobile() {
|
|
|
|
return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
|
|
|
|
}
|
2024-03-15 13:44:17 +00:00
|
|
|
|
|
|
|
export function setState<P, S>(component: Component<P, S>, state: Partial<S>): Promise<void> {
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
component.setState(state, () => {
|
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function* map<X, Y>(iter: Iterable<X>, mapper: (item: X) => Y) {
|
|
|
|
for (const item of iter) {
|
|
|
|
yield mapper(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function* filter<X>(iter: Iterable<X>, filterer: (item: X) => boolean) {
|
|
|
|
for (const item of iter) {
|
|
|
|
if (filterer(item)) {
|
|
|
|
yield item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-03-17 09:00:07 +00:00
|
|
|
|
|
|
|
// f should not resolve, if it does resolve, it should only throw an error
|
|
|
|
export async function forever(f: Promise<Error | undefined | void>) {
|
|
|
|
const r = await f;
|
|
|
|
if (r == undefined) {
|
|
|
|
throw new Error(`${f} should not resolve`);
|
|
|
|
}
|
|
|
|
throw r;
|
|
|
|
}
|