import { Sound } from "../../nlcore/elements/sound";
import { Src } from "../../nlcore/action/srcManager";
import { EventDispatcher } from "../../../util/data";
import { Image } from "../../nlcore/elements/displayable/image";
export type PreloadedSrcTypes = "image" | "audio" | "video";
export type PreloadedSrc<T extends PreloadedSrcTypes = any> = ({
    type: "image";
    src: Image;
} | {
    type: "audio";
    src: Sound;
} | {
    type: "video";
    src: string;
}) & (T extends undefined ? {} : ({
    type: T;
} & T extends "image" ? {
    src: Image;
} : T extends "audio" ? {
    src: Sound;
} : T extends "video" ? {
    src: string;
} : {}));
export type PreloadedEventTypes = {
    "event:preloaded.add": [PreloadedSrc | string];
    "event:preloaded.remove": [PreloadedSrc | string];
    "event:preloaded.change": [];
    "event:preloaded.mount": [];
    "event:preloaded.ready": [];
    "event:preloaded.unmount": [];
};
export declare class Preloaded {
    static EventTypes: {
        [K in keyof PreloadedEventTypes]: K;
    };
    preloaded: PreloadedSrc[];
    events: EventDispatcher<PreloadedEventTypes>;
    add<T extends PreloadedSrcTypes = PreloadedSrcTypes>(src: PreloadedSrc<T>): this;
    get<T extends PreloadedSrcTypes = any>(src: string): PreloadedSrc<T> | undefined;
    has(src: string): boolean;
    has(src: string[]): boolean;
    remove(src: string): this;
    remove(src: PreloadedSrc): this;
    remove(src: string[]): this;
    remove(src: PreloadedSrc[]): this;
    clear(): this;
    getSrc(src: Src | string): string | null;
}
