import type { Context } from '../../context';
import type { Middleware, MiddlewareFn, MiddlewareList, NextFn } from '../../middleware';
import type { MaybePromise } from '../../types';
export type Predicate<T> = (value: T) => MaybePromise<boolean>;
export type AsyncPredicate<T> = (value: T) => Promise<boolean>;
export declare const flatten: <C extends Context>(middleware: Middleware<C>) => MiddlewareFn<C>;
export declare const concat: <C extends Context>(first: MiddlewareFn<C>, andThen: MiddlewareFn<C>) => MiddlewareFn<C>;
export declare const pass: <C extends Context>(_ctx: C, next: NextFn) => Promise<void>;
export declare const passThrough: <C extends Context = Context>() => MiddlewareFn<C>;
export declare const compose: <C extends Context>(middlewares: MiddlewareList<C>) => MiddlewareFn<C>;
/** Одновременно запускает переданный обработчик и оставшуюся цепочку. */
export declare const fork: <C extends Context>(middleware: Middleware<C>) => MiddlewareFn<C>;
/** Выполняет дополнительное действие перед переходом к `next()`. */
export declare const tap: <C extends Context>(middleware: Middleware<C>) => MiddlewareFn<C>;
/** Вызывает `factory` для каждого события и выполняет возвращённый обработчик. */
export declare const lazy: <C extends Context>(factory: (ctx: C) => MaybePromise<Middleware<C>>) => MiddlewareFn<C>;
/** Передаёт ошибку из указанной цепочки в `errorHandler`. */
export declare const catchMiddleware: <C extends Context>(errorHandler: (error: unknown, ctx: C) => MaybePromise<void>, ...middlewares: MiddlewareList<C>) => MiddlewareFn<C>;
/** Выполняет одну из двух веток по синхронному или асинхронному условию. */
export declare const branch: <C extends Context>(predicate: boolean | Predicate<C>, onTrue: Middleware<C>, onFalse: Middleware<C>) => MiddlewareFn<C>;
/** Выполняет переданную цепочку при true и сразу вызывает `next()` при false. */
export declare const optional: <C extends Context>(predicate: Predicate<C>, ...middlewares: MiddlewareList<C>) => MiddlewareFn<C>;
/** Прекращает обработку события при true и вызывает `next()` при false. */
export declare const drop: <C extends Context>(predicate: Predicate<C>) => MiddlewareFn<C>;
