import { Awaitable } from '../../libs/promises/promises.js';

type Encoder<I, O> = SyncEncoder<I, O> | AsyncEncoder<I, O>;
interface SyncEncoder<I, O> {
    encodeOrThrow(input: I): O;
}
interface AsyncEncoder<I, O> {
    encodeOrThrow(input: I): Awaitable<O>;
}
type Bicoder<I, O> = SyncBicoder<I, O> | AsyncBicoder<I, O>;
interface SyncBicoder<I, O> {
    encodeOrThrow(input: I): O;
    decodeOrThrow(output: O): I;
}
interface AsyncBicoder<I, O> {
    encodeOrThrow(input: I): Awaitable<O>;
    decodeOrThrow(output: O): Awaitable<I>;
}
declare namespace Identity {
    function encodeOrThrow<T>(value: T): T;
    function decodeOrThrow<T>(value: T): T;
}
declare namespace Jsoned {
    function encodeOrThrow<T>(value: T): string;
    function decodeOrThrow<T>(value: string): T;
}
declare class AsyncPipeBicoder<I, X, O> implements AsyncBicoder<I, O> {
    readonly outer: AsyncBicoder<I, X>;
    readonly inner: AsyncBicoder<X, O>;
    constructor(outer: AsyncBicoder<I, X>, inner: AsyncBicoder<X, O>);
    encodeOrThrow(input: I): Promise<O>;
    decodeOrThrow(output: O): Promise<I>;
}
declare class AsyncPipeEncoder<I, X, O> implements AsyncEncoder<I, O> {
    readonly outer: AsyncEncoder<I, X>;
    readonly inner: AsyncEncoder<X, O>;
    constructor(outer: AsyncEncoder<I, X>, inner: AsyncEncoder<X, O>);
    encodeOrThrow(input: I): Promise<O>;
}
declare class SyncPipeBicoder<I, X, O> implements SyncBicoder<I, O> {
    readonly outer: SyncBicoder<I, X>;
    readonly inner: SyncBicoder<X, O>;
    constructor(outer: SyncBicoder<I, X>, inner: SyncBicoder<X, O>);
    encodeOrThrow(input: I): O;
    decodeOrThrow(output: O): I;
}
declare class SyncPipeEncoder<I, X, O> implements SyncEncoder<I, O> {
    readonly outer: SyncEncoder<I, X>;
    readonly inner: SyncEncoder<X, O>;
    constructor(outer: SyncEncoder<I, X>, inner: SyncEncoder<X, O>);
    encodeOrThrow(input: I): O;
}

export { type AsyncBicoder, type AsyncEncoder, AsyncPipeBicoder, AsyncPipeEncoder, type Bicoder, type Encoder, Identity, Jsoned, type SyncBicoder, type SyncEncoder, SyncPipeBicoder, SyncPipeEncoder };
