/**
 * @typed/fp/dom is a collection of abstractions for working with the DOM
 * @since 0.13.2
 */
import { A } from 'ts-toolbelt';
import { ParseSelector } from 'typed-query-selector/parser';
import * as E from './Env';
import * as Fail from './Fail';
import { ArgsOf } from './function';
import * as KV from './KV';
import * as O from './Option';
import * as RS from './ReaderStream';
import { Resume } from './Resume';
import { SchedulerEnv } from './Scheduler';
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type HistoryEnv = {
    readonly history: History;
};
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const getHistory: E.Env<HistoryEnv, History>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type LocationEnv = {
    readonly location: Location;
};
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const getLocation: E.Env<LocationEnv, Location>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type RafEnv = {
    readonly raf: Resume<number>;
};
/**
 * @category Effect
 * @since 0.13.2
 */
export declare const raf: E.Env<RafEnv, number>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type WhenIdleEnv = {
    readonly whenIdle: Resume<IdleDeadline>;
};
/**
 * @category Effect
 * @since 0.13.2
 */
export declare const whenIdle: E.Env<WhenIdleEnv, IdleDeadline>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type WindowEnv = {
    readonly window: Window;
};
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const getWindow: E.Env<WindowEnv, Window>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type DocumentEnv = {
    readonly document: Document;
};
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const getDocument: E.Env<DocumentEnv, Document>;
/**
 * @category Environment
 * @since 0.13.2
 */
export declare type RootElementEnv = {
    readonly rootElement: Element;
};
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const getRootElement: E.Env<RootElementEnv, Element>;
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const querySelector: <S extends string>(selector: S) => <N extends ParentNode>(el: N) => O.Option<NonNullable<ParseSelector<S, A.Cast<N, Element>>>>;
/**
 * @category DOM
 * @since 0.13.2
 */
export declare const querySelectorAll: <S extends string>(selector: S) => <N extends ParentNode>(el: N) => readonly ParseSelector<S, Element>[];
/**
 * A Failure used to represent being unable to query for our RootElement
 * @category Failure
 * @since 0.13.4
 */
export declare const QueryRootElementFailure: Fail.Failure<"@typed/fp/dom/QueryRootElementError", {
    readonly selector: string;
    readonly message: string;
}>;
/**
 * A Failure used to represent being unable to query for our RootElement
 * @category Environment
 * @since 0.13.4
 */
export declare type QueryRootElementFailure = Fail.EnvOf<typeof QueryRootElementFailure>;
/**
 * Provide the root element to your application by querying for an element in the document
 * @category DOM
 * @since 0.13.2
 */
export declare const queryRootElement: (selector: string) => E.Env<Fail.Fail<"@typed/fp/dom/QueryRootElementError", {
    readonly selector: string;
    readonly message: string;
}> & DocumentEnv, RootElementEnv>;
/**
 * Common setup for rendering an application into an element
 * @category DOM
 * @since 0.13.4
 */
export declare const patch: <Patch extends (element: any, renderable: any) => any>(patch: Patch) => <E>(stream: RS.ReaderStream<E, ArgsOf<Patch>[1]>) => RS.ReaderStream<E & KV.Env & RootElementEnv & Fail.Fail<"@typed/fp/dom/QueryRootElementError", {
    readonly selector: string;
    readonly message: string;
}>, ArgsOf<Patch>[0]>;
/**
 * Find the default EventMap for a given element
 * @category Type-level
 * @since 0.13.4
 */
export declare type GetDefaultEventMap<Target> = Target extends Window ? WindowEventMap : Target extends Document ? DocumentEventMap : Target extends HTMLBodyElement ? HTMLBodyElementEventMap : Target extends HTMLVideoElement ? HTMLVideoElementEventMap : Target extends HTMLMediaElement ? HTMLMediaElementEventMap : Target extends HTMLFrameSetElement ? HTMLFrameSetElementEventMap : Target extends HTMLElement ? HTMLElementEventMap : Target extends SVGElement ? SVGElementEventMap : Target extends Element ? ElementEventMap : Readonly<Record<string, unknown>>;
/**
 * Append the proper CurrentTarget to an Event
 * @category Type-level
 * @since 0.13.4
 */
export declare type WithCurrentTarget<Ev, Target> = Ev & {
    readonly currentTarget: Target;
};
/**
 * @category Use
 * @since 0.13.4
 */
export declare const useEventListener: <E1, Target extends EventTarget, EventName extends string, E2, A>(getEventListener: E.Env<E1, O.Option<Target>>, eventName: EventName, onEvent: (event: WithCurrentTarget<GetDefaultEventMap<Target>[EventName], Target>) => E.Env<E2, A>) => E.Env<E1 & E2 & KV.Env & SchedulerEnv, O.Option<A>>;
/**
 * @category Use
 * @since 0.13.2
 */
export declare const usePopstate: () => E.Env<HistoryEnv & WindowEnv & KV.Env & SchedulerEnv, unknown>;
/**
 * @category Use
 * @since 0.13.2
 */
export declare const useHashChange: () => E.Env<LocationEnv & WindowEnv & KV.Env & SchedulerEnv, string>;
/**
 * @category Use
 * @since 0.13.2
 */
export declare const useWhenUrlChanges: <E, A>(env: E.Env<E, A>) => E.Env<LocationEnv & WindowEnv & KV.Env & SchedulerEnv & HistoryEnv & E, A>;
/**
 * @category Use
 * @since 0.13.2
 */
export declare const useLocation: E.Env<LocationEnv & WindowEnv & KV.Env & SchedulerEnv & HistoryEnv, Location>;
/**
 * @category Use
 * @since 0.13.2
 */
export declare const useHistory: E.Env<LocationEnv & WindowEnv & KV.Env & SchedulerEnv & HistoryEnv, History>;
/**
 * @category History
 * @since 0.13.2
 */
export declare const pushState: <A>(state: A, path: string) => E.Env<HistoryEnv, void>;
/**
 * @category History
 * @since 0.13.2
 */
export declare const navigateTo: (path: string) => E.Env<HistoryEnv, void>;
/**
 * @category History
 * @since 0.13.2
 */
export declare const replaceState: <A>(state: A, path: string) => E.Env<HistoryEnv, void>;
/**
 * @category History
 * @since 0.13.2
 */
export declare const getState: E.Env<HistoryEnv, unknown>;
/**
 * @category History
 * @since 0.13.3
 */
export declare const goBack: E.Env<HistoryEnv, void>;
/**
 * @category History
 * @since 0.13.3
 */
export declare const goForward: E.Env<HistoryEnv, void>;
/**
 * @category History
 * @since 0.13.3
 */
export declare const goTo: (n: number) => E.Env<HistoryEnv, void>;
/**
 * @category Location
 * @since 0.13.2
 */
export declare const reload: E.Env<LocationEnv, void>;
/**
 * @category Location
 * @since 0.13.2
 */
export declare const assign: (url: string | URL) => E.Env<LocationEnv, void>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getHash: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getPathname: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getOrigin: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getHref: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getHost: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getHostname: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getPort: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getProtocol: E.Env<LocationEnv, string>;
/**
 * @category Location
 * @since 0.13.3
 */
export declare const getSearch: E.Env<LocationEnv, string>;
//# sourceMappingURL=dom.d.ts.map