/**
 * The MIT License (MIT)
 * Copyright (c) Taketoshi Aono
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 * @fileoverview
 * @author Taketoshi Aono
 */
import { StateHandler } from '../handler/state-handler';
import { HandlerResponse, StreamStore } from '../handler/handler';
import { Subscription } from 'rxjs';
/**
 * User defined Intent instance.
 */
export interface IntentClass {
}
/**
 * User defined Intent class constructor.
 */
export interface IntentConstructor {
    new (dispatch: (type: string, payload: any) => void, handlers: {
        [key: string]: HandlerResponse;
    }): IntentClass;
}
/**
 * Intent decorator that assign StateHandler to instance properties.
 */
export declare function intent<T extends IntentConstructor>(Base: T): any;
/**
 * Singleton event publisher.
 */
export declare class Intent extends StateHandler {
    /**
     * Event history.
     */
    private history;
    private children;
    private parent;
    constructor(parent?: Intent | null);
    private addChild;
    private removeChild;
    dispose(): void;
    prepare(parent?: Intent | null): void;
    subscribe(props: {
        [key: string]: any;
    }): Subscription;
    clone(...args: any[]): this;
    /**
     * Publish event.
     * @override
     * @param key Event name. If 'RETRY' passed, past published event will be republishing.
     * @param args Event args. If a first argument was 'RETRY', specify history index.
     * If empty, last event will be publishing.
     */
    push(key: string, args?: any): Promise<any>;
    getStreamStore(): StreamStore;
    /**
     * Return callback function that will publish event.
     * @override
     * @param key Event name.
     * @param v Event args. Override publish args.
     */
    callback<Args = any, ReturnType = any>(key: string, v?: any): (args?: Args) => Promise<ReturnType>;
    private findSubjects;
    private findParentSubjects;
    private findChildrenSubjects;
    private findHistory;
    private findParentHistory;
    private findChildrenHistory;
}
