import { getEncoder } from './encoder.js';
import { Decoder } from './decoder.js';
import type { EncodeOptions, DecodeOptions } from './options.js';

export { UnexpectedEofError as UnexpectedEof } from './helper/errors.js';
export type { EncodeOptions, DecodeOptions };

/** 编码为 UBJSON */
export function encode(value: unknown, options?: EncodeOptions): Uint8Array {
    return getEncoder(options).encode(value);
}

/** 编码为 UBJSON */
export function encodeMany(value: Iterable<unknown>, options?: EncodeOptions): Uint8Array {
    return getEncoder(options).encodeMany(value);
}

/** 解码 UBJSON */
export function decode(value: BufferSource, options?: DecodeOptions): unknown {
    const decoder = new Decoder(value, options);
    return decoder.decode();
}

/** 解码 UBJSON */
export function* decodeMany(value: BufferSource, options?: DecodeOptions): Iterable<unknown> {
    const decoder = new Decoder(value, options);
    while (!decoder.ended) {
        yield decoder.decode();
    }
}
