import type { FreeSemigroup } from "../../FreeSemigroup"; import type { DecodeError, Kind } from "./model"; export const fold = (patterns: { Leaf: (input: unknown, expected: string) => R; Key: (key: string, kind: Kind, errors: FreeSemigroup>) => R; Index: (index: number, kind: Kind, errors: FreeSemigroup>) => R; Member: (index: number, errors: FreeSemigroup>) => R; Lazy: (id: string, errors: FreeSemigroup>) => R; Wrap: (error: E, errors: FreeSemigroup>) => R; Info: (error: E) => R; }): ((e: DecodeError) => R) => { const f = (e: DecodeError): R => { switch (e._tag) { case "Leaf": return patterns.Leaf(e.actual, e.expected); case "Key": return patterns.Key(e.key, e.kind, e.errors); case "Index": return patterns.Index(e.index, e.kind, e.errors); case "Member": return patterns.Member(e.index, e.errors); case "Lazy": return patterns.Lazy(e.id, e.errors); case "Wrap": return patterns.Wrap(e.error, e.errors); case "Info": return patterns.Info(e.error); } }; return f; };