import { Interpolate, ParamsOf } from './Path';
import { ReaderOption } from './ReaderOption';
/**
 * @category Model
 * @since 0.13.0
 */
export interface Route<P extends string, A = ParamsOf<P>> {
    readonly path: P;
    readonly match: ReaderOption<string, A>;
    readonly createPath: <I extends ParamsOf<P>>(params: I) => Interpolate<P, I>;
}
/**
 * @category Type-level
 * @since 0.13.0
 */
export declare type PathOf<A> = [A] extends [Route<infer R>] ? R : never;
/**
 * @category Type-level
 * @since 0.13.0
 */
export declare type ValueOf<A> = [A] extends [Route<infer R>] ? ParamsOf<R> : never;
/**
 * @category Constructor
 * @since 0.13.0
 */
export declare function make<P extends string>(path: P): Route<P>;
/**
 * @category Combinator
 * @since 0.13.0
 */
export declare function map<A, B>(f: (value: A) => B): <P extends string>(route: Route<P, A>) => Route<P, B>;
/**
 * @category Combinator
 * @since 0.13.0
 */
export declare function oneOf<Routes extends readonly [Route<string>, ...Route<string>[]]>(...[first, ...rest]: Routes): ReaderOption<string, OneOf<Routes>>;
/**
 * @category Type-level
 * @since 0.13.0
 */
export declare type OneOf<Routes extends readonly [Route<string>, ...Route<string>[]]> = ValueOf<Routes[number]>;
//# sourceMappingURL=Route.d.ts.map