export type Encoding<T> = {
    /** Should this value use this encoding? */
    match: (value: unknown) => boolean;
    encode: (value: T, encode: (value: any) => string) => string;
    decode: (value: string, decode: (value: string) => any) => T;
    /** This is for in-memory comparison without serializing. */
    compare: (a: T, b: T, compare: (a: any, b: any) => -1 | 0 | 1) => -1 | 0 | 1;
};
export declare const NullEncoding: Encoding<null>;
export declare const BooleanEncoding: Encoding<boolean>;
export declare const StringEncoding: Encoding<string>;
export declare const NumberEncoding: Encoding<number>;
export declare const ArrayEncoding: Encoding<any[]>;
export declare const ObjectEncoding: Encoding<object>;
export declare const ObjectLegacyEncoding: Encoding<object>;
export declare const MIN: unique symbol;
export declare const MAX: unique symbol;
export declare const MinEncoding: Encoding<typeof MIN>;
export declare const MaxEncoding: Encoding<typeof MAX>;
export declare class Codec {
    encodings: {
        [prefixByte: string]: Encoding<any>;
    };
    constructor(encodings: {
        [prefixByte: string]: Encoding<any>;
    });
    encode: (value: any) => string;
    decode: (value: string) => any;
    compare: (a: any, b: any) => -1 | 0 | 1;
}
export declare const jsonCodec: Codec;
