import preserves, std/tables type AnyAtomKind* {.pure.} = enum `bool`, `float`, `double`, `int`, `string`, `bytes`, `symbol`, `embedded` AnyAtomBool* = bool AnyAtomFloat* = float32 AnyAtomDouble* = float64 AnyAtomInt* = BiggestInt AnyAtomString* = string AnyAtomBytes* = seq[byte] AnyAtomSymbol* = Symbol AnyAtomEmbedded*[Cap] = Cap `AnyAtom`*[Cap] {.preservesOr.} = object case orKind*: AnyAtomKind of AnyAtomKind.`bool`: `bool`*: AnyAtomBool of AnyAtomKind.`float`: `float`*: AnyAtomFloat of AnyAtomKind.`double`: `double`*: AnyAtomDouble of AnyAtomKind.`int`: `int`*: AnyAtomInt of AnyAtomKind.`string`: `string`*: AnyAtomString of AnyAtomKind.`bytes`: `bytes`*: AnyAtomBytes of AnyAtomKind.`symbol`: `symbol`*: AnyAtomSymbol of AnyAtomKind.`embedded`: `embedded`*: AnyAtomEmbedded[Cap] DLit*[Cap] {.preservesRecord: "lit".} = object `value`*: AnyAtom[Cap] DBind*[Cap] {.acyclic, preservesRecord: "bind".} = ref object `pattern`*: Pattern[Cap] DDiscard* {.preservesRecord: "_".} = object DCompoundKind* {.pure.} = enum `rec`, `arr`, `dict` DCompoundRec*[Cap] {.acyclic, preservesRecord: "rec".} = ref object `label`*: Preserve[Cap] `fields`*: seq[Pattern[Cap]] DCompoundArr*[Cap] {.acyclic, preservesRecord: "arr".} = ref object `items`*: seq[Pattern[Cap]] DCompoundDict*[Cap] {.acyclic, preservesRecord: "dict".} = ref object `entries`*: Table[Preserve[Cap], Pattern[Cap]] `DCompound`*[Cap] {.acyclic, preservesOr.} = ref object case orKind*: DCompoundKind of DCompoundKind.`rec`: `rec`*: DCompoundRec[Cap] of DCompoundKind.`arr`: `arr`*: DCompoundArr[Cap] of DCompoundKind.`dict`: `dict`*: DCompoundDict[Cap] PatternKind* {.pure.} = enum `DDiscard`, `DBind`, `DLit`, `DCompound` `Pattern`*[Cap] {.acyclic, preservesOr.} = ref object case orKind*: PatternKind of PatternKind.`DDiscard`: `ddiscard`*: DDiscard of PatternKind.`DBind`: `dbind`*: DBind[Cap] of PatternKind.`DLit`: `dlit`*: DLit[Cap] of PatternKind.`DCompound`: `dcompound`*: DCompound[Cap] proc `$`*[Cap](x: AnyAtom[Cap] | DLit[Cap] | DBind[Cap] | DCompound[Cap] | Pattern[Cap]): string = `$`(toPreserve(x, Cap)) proc encode*[Cap](x: AnyAtom[Cap] | DLit[Cap] | DBind[Cap] | DCompound[Cap] | Pattern[Cap]): seq[byte] = encode(toPreserve(x, Cap)) proc `$`*(x: DDiscard): string = `$`(toPreserve(x)) proc encode*(x: DDiscard): seq[byte] = encode(toPreserve(x))