import { Codec, createCodec, metadata, ScaleDecodeError } from "../common/mod.js" export function option($some: Codec): Codec export function option($some: Codec, none: N): Codec export function option($some: Codec, none?: N): Codec { if ($some._metadata.some((x) => x.factory === option && x.args[1] === none)) { throw new Error("Nested option codec will not roundtrip correctly") } return createCodec({ _metadata: metadata("$.option", option, $some, ...(none === undefined ? [] : [none!]) as [N]), _staticSize: 1 + $some._staticSize, _encode(buffer, value) { if ((buffer.array[buffer.index++] = +(value !== none))) { $some._encode(buffer, value as SI) } }, _decode(buffer) { switch (buffer.array[buffer.index++]) { case 0: return none as N case 1: { const value = $some._decode(buffer) if (value === none) { throw new ScaleDecodeError(this, buffer, "Some(None) will not roundtrip correctly") } return value } default: throw new ScaleDecodeError(this, buffer, "Option discriminant neither 0 nor 1") } }, _assert(assert) { if (assert.value === none) return $some._assert(assert) }, }) }