import type { ComposeLeft } from 'hotscript';
import type { ITransformerDTO, SerializableTransformer, Transformer, TypedTransformer } from './transformer.js';
import type { TransformerDTOs, TypeModifiers } from './types.js';
export declare class Pipe<TRANSFORMERS extends Transformer[] = Transformer[]> implements TypedTransformer<ReturnType<TRANSFORMERS[0]['decode']>, Parameters<TRANSFORMERS[0]['encode']>[0], ReturnType<LastTransformer<TRANSFORMERS>['encode']>, ComposeLeft<TypeModifiers<TRANSFORMERS>>> {
    _typeModifier: ComposeLeft<TypeModifiers<TRANSFORMERS>>;
    transformerId: 'pipe';
    transformers: TRANSFORMERS;
    encode: (decoded: Parameters<TRANSFORMERS[0]['encode']>[0]) => ReturnType<LastTransformer<TRANSFORMERS>['encode']>;
    decode: (encoded: ReturnType<LastTransformer<TRANSFORMERS>['encode']>) => ReturnType<TRANSFORMERS[0]['decode']>;
    constructor(transformers: TRANSFORMERS);
    pipe<TRANSFORMER extends Transformer<ReturnType<LastTransformer<TRANSFORMERS>['encode']>>>(transformer: TRANSFORMER): Piped<[...TRANSFORMERS, TRANSFORMER]>;
}
export declare class SerializablePipe<TRANSFORMERS extends SerializableTransformer[] = SerializableTransformer[]> extends Pipe<TRANSFORMERS> implements SerializableTransformer<ReturnType<TRANSFORMERS[0]['decode']>, Parameters<TRANSFORMERS[0]['encode']>[0], ReturnType<LastTransformer<TRANSFORMERS>['encode']>, ComposeLeft<TypeModifiers<TRANSFORMERS>>, PipeDTO<TransformerDTOs<TRANSFORMERS>>> {
    constructor(transformers: TRANSFORMERS);
    toJSON(): PipeDTO<TransformerDTOs<TRANSFORMERS>>;
}
export interface PipeDTO<TRANSFORMER_DTOS extends ITransformerDTO[] = ITransformerDTO[]> {
    transformerId: 'pipe';
    transformers: TRANSFORMER_DTOS;
}
type LastTransformer<TRANSFORMERS extends Transformer[]> = TRANSFORMERS extends [
    infer TRANSFORMERS_HEAD,
    ...infer TRANSFORMERS_TAIL
] ? TRANSFORMERS_HEAD extends Transformer ? TRANSFORMERS_TAIL extends [Transformer, ...Transformer[]] ? LastTransformer<TRANSFORMERS_TAIL> : TRANSFORMERS_HEAD : never : TRANSFORMERS[0];
export type Piped<TRANSFORMERS extends Transformer[]> = TRANSFORMERS extends SerializableTransformer[] ? SerializablePipe<TRANSFORMERS> : Pipe<TRANSFORMERS>;
type Piper = <TRANSFORMERS extends Transformer[]>(...transformers: TRANSFORMERS) => Piped<TRANSFORMERS>;
export declare const pipe: Piper;
export {};
