type DictionaryValue = string | number | boolean | null | undefined;
type DictionaryTuple = readonly [DictionaryValue, DictionaryValue];
type Dictionary = DictionaryTuple[];
interface Dictionaries {
    [key: string]: Dictionary;
}
interface InitialState {
    target?: unknown;
    rev?: boolean;
    noDefaults?: boolean;
}
interface State extends InitialState {
    context: unknown[];
    value: unknown;
    flip?: boolean;
    arr?: boolean;
    iterate?: boolean;
    index?: number;
    untouched?: boolean;
}
interface Options {
    transformers?: {
        [key: string | symbol]: Transformer | AsyncTransformer;
    };
    pipelines?: {
        [key: string | symbol]: TransformDefinition;
    };
    dictionaries?: Dictionaries;
    nonvalues?: unknown[];
    fwdAlias?: string;
    revAlias?: string;
    modifyOperationObject?: (operation: Record<string, unknown>) => Record<string, unknown>;
    modifyGetValue?: (value: unknown, state: State, options: Options) => unknown;
}
interface DataMapper<T extends InitialState | undefined = State> {
    (data: unknown, state?: T): Promise<unknown>;
}
interface AsyncDataMapperWithState {
    (data: unknown, state: State): Promise<unknown>;
}
interface DataMapperWithState {
    (data: unknown, state: State): unknown;
}
interface AsyncDataMapperWithOptions {
    (options: Options): AsyncDataMapperWithState;
}
interface DataMapperWithOptions {
    (options: Options): DataMapperWithState;
}
interface StateMapper {
    (state: State): Promise<State>;
}
interface NextStateMapper {
    (next: StateMapper): StateMapper;
}
interface Operation {
    (options: Options): NextStateMapper;
}
type TransformerProps = Record<string, unknown>;
interface Transformer<T = TransformerProps> {
    (props: T): DataMapperWithOptions;
}
interface AsyncTransformer<T = TransformerProps> {
    (props: T): AsyncDataMapperWithOptions;
}
type Path = string;
interface TransformOperation extends TransformerProps {
    $transform: string | symbol | DataMapperWithOptions | AsyncDataMapperWithOptions;
    $iterate?: boolean;
    $direction?: string;
}
interface FilterOperation extends TransformerProps {
    $filter: string | symbol;
    $direction?: string;
}
interface IfOperation extends TransformerProps {
    $if: TransformDefinition;
    $direction?: string;
    then?: TransformDefinition;
    else?: TransformDefinition;
}
interface ApplyOperation extends TransformerProps {
    $apply: string | symbol;
    $iterate?: boolean;
    $direction?: string;
}
interface AltOperation extends TransformerProps {
    $alt: TransformDefinition[];
    $iterate?: boolean;
    $direction?: string;
    $undefined?: unknown[];
}
interface ConcatOperation extends TransformerProps {
    $concat: TransformDefinition[];
}
interface ConcatRevOperation extends TransformerProps {
    $concatRev: TransformDefinition[];
}
interface LookupOperation extends TransformerProps {
    $lookup: Path;
    path: Path;
}
interface LookdownOperation extends TransformerProps {
    $lookdown: Path;
    path: Path;
}
type OperationObject = TransformOperation | FilterOperation | IfOperation | ApplyOperation | AltOperation | ConcatOperation | ConcatRevOperation | LookupOperation | LookdownOperation;
type Pipeline = (TransformObject | Operation | OperationObject | Path | Pipeline)[];
interface TransformObject extends Record<string, unknown> {
    $iterate?: boolean;
    $modify?: boolean | Path;
    $noDefaults?: boolean;
    $flip?: boolean;
    $direction?: string;
}
type TransformDefinition = TransformObject | Operation | OperationObject | Pipeline | Path | null;

export type { AltOperation, ApplyOperation, AsyncDataMapperWithOptions, AsyncDataMapperWithState, AsyncTransformer, ConcatOperation, ConcatRevOperation, DataMapper, DataMapperWithOptions, DataMapperWithState, Dictionaries, Dictionary, DictionaryTuple, DictionaryValue, FilterOperation, IfOperation, InitialState, LookdownOperation, LookupOperation, NextStateMapper, Operation, OperationObject, Options, Path, Pipeline, State, StateMapper, TransformDefinition, TransformObject, TransformOperation, Transformer, TransformerProps };
