import { RawArgument } from "./raw";
import { Token } from "./token";
import { Container } from "./container";
export declare type Argument<T = unknown> = Token<T> | RawArgument<T>;
export declare type Constructor<T = unknown> = new (...args: any[]) => T;
export declare type Func<T = unknown> = (...args: any[]) => T;
export declare type Creator<T = unknown> = Constructor<T> | Func<T>;
export declare type Creates<T extends Creator> = T extends Constructor ? InstanceType<T> : T extends Func ? ReturnType<T> : never;
export declare type CreatorParameters<T extends Creator> = T extends Constructor ? ConstructorParameters<T> : T extends Func ? Parameters<T> : never;
export declare type Arguments<T extends Creator> = ToArguments<CreatorParameters<T>>;
export declare type ToArguments<T extends unknown[]> = {
    [K in keyof T]: Argument<T[K]>;
};
export declare type Request = {
    token: Token;
    callback: () => void;
};
export declare type Dependency<T = unknown> = {
    token: Token<T>;
    creator: Creator<T>;
    args: Argument[];
    shared: boolean;
    instance?: any;
};
export declare type ProviderCallback = (container: Container) => void;
export declare type Provider = {
    tokens: Token[];
    called?: boolean;
    callback: () => void;
};
export declare type GetCallback<T> = (instance: T) => void;
export interface Module {
    provides: Token[];
    register: ProviderCallback;
}
