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