/**
 *
 * Binder provide functionality to bind data to any component
 * T - request type
 * K - data type
 *
 * To use Binder you need to create instance of it and provide request and response types
 * Use request() to send request to data source via request pipeline, anyone can subscribe to request pipeline
 * Use subscribe() to request data from source via response pipeline, anyone can subscribe to response pipeline
 * Use execute() to request data from source and wait for response
 * Use use() to bind data to react component, before using it you need to setup react hooks, by calling Binder.setupReact(useState,useEffect)
 *
 */
export declare class Binder<T, K> {
    private static reactUseState;
    private static reactUseEffect;
    private static nextID;
    name: string;
    type: "signal" | "request" | "binder";
    private readyListener;
    private requestListener;
    constructor(name?: string);
    /**
     * Setup react hook before using it
     * @param useState - reference to react useState
     * @param useEffect - reference to react useEffect
     */
    static setupReact(useState: any, useEffect: any): void;
    /**
        subscribe to request pipeline
    */
    onRequest(cb: (data: T | null) => void): void;
    /**
        subscribe to response pipeline
    */
    subscribe(cb: (data: K | null) => void): void;
    /**
        invoke response pipeline
    */
    invoke(data: K): void;
    request(req: T | null): void;
    /**
        Execute binder & wait for results
    */
    execute(req: T | null): Promise<K | null>;
    /**
    * Binder hook
    * request - request object for data loading procedure
    * initial - initial data object
    * dependency - react dependency array
    * return - array [data,busy], where first element - Binded data, second element - Busy indicator
    */
    use(request?: T, initial?: K, dependency?: any[]): [K | null, boolean];
    clear(): void;
}
