interface SubscribeToken {
    unsubscribe: () => void;
}
interface KeepToken {
    release: () => void;
}
interface CommonObject {
    [key: string]: any[];
}
interface Callback<T extends CommonObject, K extends keyof T> {
    (...args: T[K]): void;
}
declare type Listener<T extends CommonObject> = Partial<Record<keyof T, {
    token: string;
    fn: Callback<T, any>;
}[]>>;
interface Keep<T extends CommonObject> {
    shouldPublish: true | (() => boolean);
    name: keyof T;
    token: string;
    args: any[];
}
declare class Topic<T extends CommonObject> {
    protected listeners: Listener<T>;
    protected origins: Listener<T>;
    protected keeps: Keep<T>[];
    publish<K extends keyof T>(name: K, ...args: T[K]): void;
    subscribeOnce<K extends keyof T>(name: K, fn: Callback<T, K>): SubscribeToken;
    subscribe<K extends keyof T>(name: K, fn: Callback<T, K>): SubscribeToken;
    /**
     * Keep publishing for every subscription.
     * The deps can be `true` or a function `() => true/false`. For dynamic publishing, function is required.
     * ```javascript
     * let deps = true;
     * topic.keep('test', () => deps, 'hello', 'world');
     * ```
     */
    keep<K extends keyof T>(name: K, shouldPublish: Keep<T>['shouldPublish'], ...args: T[K]): KeepToken;
    protected unsubscribe(name: keyof T, token: string): void;
    protected release(token: string): void;
}
declare const topic: Topic<CommonObject>;

export { CommonObject, KeepToken, SubscribeToken, Topic, topic };
