import * as cbor from "cbor2"; import { Data, Effect, pipe, Schema } from "effect"; export class CborDecodeError extends Data.TaggedError("CborDecodeError")<{ cause: unknown }> { } export class CborEncodeError extends Data.TaggedError("CborEncodeError")<{ cause: unknown }> { } export function encode(u: unknown): Effect.Effect, CborEncodeError> { return Effect.try({ try: () => cbor.encode(u) as Uint8Array, catch: (cause) => new CborEncodeError({ cause }), }); } export function decode(u: Uint8Array): Effect.Effect { return Effect.try({ try: () => cbor.decode(u), catch: (cause) => new CborDecodeError({ cause }), }); } export const encodeSchema = (schema: Schema.Schema) => { const schemaEncoder = Schema.encode(schema); return (a: A) => pipe( schemaEncoder(a), Effect.flatMap((i) => encode(i)), ); }; export const decodeSchema = (schema: Schema.Schema) => { const schemaDecoder = Schema.decodeUnknown(schema); return (u: Uint8Array) => pipe( decode(u), Effect.flatMap((u) => schemaDecoder(u)), ); };