// tracing: off import * as S from "./_schema.js" /** * @tsplus type ets/Schema/Encoder */ export type Encoder = { (u: Output): Encoded } export const interpreters: (( schema: S.SchemaAny ) => Opt<() => Encoder>)[] = [ Opt.partial(miss => (schema: S.SchemaAny): (() => Encoder) => { if (schema instanceof S.SchemaIdentity) { return () => _ => _ } if (schema instanceof S.SchemaPipe) { const encodeSelf = encoderFor(schema.that) const encodeThat = encoderFor(schema.self) return () => _ => encodeThat(encodeSelf(_)) } if (schema instanceof S.SchemaRefinement) { return () => encoderFor(schema.self) } if (schema instanceof S.SchemaEncoder) { return () => schema.encoder } return miss() } ) ] const cache = new WeakMap() function encoderFor( schema: S.Schema ): Encoder { if (cache.has(schema)) { return cache.get(schema) } if (schema instanceof S.SchemaLazy) { const encoder: Encoder = __ => encoderFor(schema.self())(__) cache.set(schema, encoder) return encoder as Encoder } for (const interpreter of interpreters) { const _ = interpreter(schema) if (_._tag === "Some") { let x: Encoder const encoder: Encoder = u => { if (!x) { x = _.value() } return x(u) } cache.set(schema, encoder) return encoder as Encoder } } if (S.hasContinuation(schema)) { let x: Encoder const encoder: Encoder = u => { if (!x) { x = encoderFor(schema[S.SchemaContinuationSymbol]) } return x(u) } cache.set(schema, encoder) return encoder as Encoder } throw new Error(`Missing parser integration for: ${schema.constructor}`) } export { encoderFor as for }