spica
Version:
Supervisor, Coroutine, Channel, select, AtomicPromise, Cancellation, Cache, List, Queue, Stack, and some utils.
32 lines (27 loc) • 684 B
text/typescript
export function singleton<f extends (...args: unknown[]) => unknown>(f: f): f {
let result: unknown;
assert(result === noop());
return function (this: unknown, ...as) {
if (f === noop) return result;
result = f.call(this, ...as);
f = noop as f;
return result;
} as f;
}
export function clear<as extends unknown[]>(f: (...as: as) => void): (...as: as) => undefined {
return (...as) => void f(...as);
}
export function id<a>(a: a): a {
return a;
}
export function fix<a>(f: (a: a) => a): (a: a) => a {
return a1 => {
const a2 = f(a1);
return a1 === a2
|| a2 !== a2
? a2
: f(a2);
};
}
export function noop(): undefined {
}