@typed/io
Version:
Runtime IO type system
32 lines • 1.93 kB
TypeScript
import { Flatten, UnNest } from '@typed/common';
export interface Encoder<I = any, O = any> {
readonly encode: (i: I) => O;
}
export declare type InputOf<E> = E extends Encoder<infer R, any> ? R : never;
export declare type OutputOf<E> = E extends Encoder<any, infer R> ? R : never;
export declare namespace Encoder {
const id: <A extends unknown>() => Encoder<A, A>;
}
export declare function partial<P extends Readonly<Record<PropertyKey, Encoder<any, any>>>>(properties: P): Encoder<Partial<{
readonly [K in keyof P]: InputOf<P[K]>;
}>, Partial<{
readonly [K in keyof P]: OutputOf<P[K]>;
}>>;
export declare function record<P extends Readonly<Record<PropertyKey, Encoder<any, any>>>>(properties: P): Encoder<{
readonly [K in keyof P]: InputOf<P[K]>;
}, {
readonly [K in keyof P]: OutputOf<P[K]>;
}>;
export declare function array<I, O>(items: Encoder<I, O>): Encoder<readonly I[], readonly O[]>;
export declare function tuple<A extends ReadonlyArray<Encoder>>(encoders: A): Encoder<{
readonly [K in keyof A]: InputOf<A[K]>;
}, {
readonly [K in keyof A]: OutputOf<A[K]>;
}>;
export declare function intersection<A extends ReadonlyArray<Encoder>>(encoders: A): Encoder<InputIntersection<A>, OutputIntersection<A>>;
declare type InputIntersection<A extends readonly any[]> = UnNest<Flatten<EncoderInputConsList<A>, unknown>>;
declare type OutputIntersection<A extends readonly any[]> = UnNest<Flatten<EncoderOutputConsList<A>, unknown>>;
declare type EncoderInputConsList<A extends readonly any[]> = [] extends A ? unknown : ((...a: A) => any) extends (t: infer T, ...ts: infer TS) => any ? [InputOf<T>, EncoderInputConsList<TS>] : unknown;
declare type EncoderOutputConsList<A extends readonly any[]> = [] extends A ? unknown : ((...a: A) => any) extends (t: infer T, ...ts: infer TS) => any ? [OutputOf<T>, EncoderOutputConsList<TS>] : unknown;
export {};
//# sourceMappingURL=Encoder.d.ts.map