import type { DecodeBuffer } from "./buffer.js" import type { AnyCodec } from "./codec.js" export abstract class ScaleError extends Error { constructor(readonly codec: AnyCodec, message: string) { super(message) } } export class ScaleAssertError extends ScaleError { override readonly name = "ScaleAssertError" constructor(codec: AnyCodec, readonly value: unknown, message: string) { super(codec, message) } } export class ScaleEncodeError extends ScaleError { override readonly name = "ScaleEncodeError" constructor(codec: AnyCodec, readonly value: unknown, message: string) { super(codec, message) } } export class ScaleDecodeError extends ScaleError { override readonly name = "ScaleDecodeError" constructor(codec: AnyCodec, readonly buffer: DecodeBuffer, message: string) { super(codec, message) } } export type Expand = T extends T ? { [K in keyof T]: T[K] } : never export type U2I = (U extends U ? (u: U) => 0 : never) extends (i: infer I) => 0 ? Extract : never type _Narrow = [U] extends [T] ? U : Extract export type Narrow = | _Narrow | _Narrow | _Narrow | _Narrow | _Narrow | _Narrow | _Narrow | (T extends object ? { [K in keyof T]: Narrow } : never) | Extract<{} | null | undefined, T>