import { MuxAsyncIterator } from "../async/mux_async_iterator.ts";import { deferred } from "../async/deferred.ts";
export type Disposable = { dispose: () => void };
export function signal( ...signals: [Deno.Signal, ...Deno.Signal[]]): AsyncIterable<void> & Disposable { const mux = new MuxAsyncIterator<void>();
if (signals.length < 1) { throw new Error( "No signals are given. You need to specify at least one signal to create a signal stream.", ); }
const streams = signals.map(createSignalStream);
streams.forEach((stream) => { mux.add(stream); });
const dispose = () => { streams.forEach((stream) => { stream.dispose(); }); };
return Object.assign(mux, { dispose });}
function createSignalStream( signal: Deno.Signal,): AsyncIterable<void> & Disposable { let streamContinues = deferred<boolean>(); const handler = () => { streamContinues.resolve(true); }; Deno.addSignalListener(signal, handler);
const gen = async function* () { while (await streamContinues) { streamContinues = deferred<boolean>(); yield undefined; } };
return Object.assign(gen(), { dispose() { streamContinues.resolve(false); Deno.removeSignalListener(signal, handler); }, });}