export type PubsubListener<A extends any[]> = (...a: A) => (void | Promise<void>);
export interface Pubsub<A extends any[] = []> {
    (fn: PubsubListener<A>): () => void;
    publish(...a: A): Promise<void>;
    once(): Promise<A>;
    clear(): void;
}
/**
 * simple pub-sub mechanism.
 *
 *     // create pubsub function
 *     const onCount = pubsub<[string, number]>()
 *
 *     // subscribe
 *     const stop = onCount((a, b) => console.log(a, b))
 *
 *     // publish
 *     onWhatever.publish("count", 123)
 *
 *     // unsubscribe
 *     stop()
 *
 */
export declare function pubsub<A extends any[] = []>(): Pubsub<A>;
