2021-09-27 13:58:36 +00:00
|
|
|
|
2023-10-26 14:28:52 +00:00
|
|
|
import
|
|
|
|
preserves, std/tables
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
Ref* {.preservesRecord: "ref".} = object
|
|
|
|
`module`*: ModulePath
|
2022-02-20 04:33:15 +00:00
|
|
|
`name`*: Symbol
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2022-02-20 04:33:15 +00:00
|
|
|
ModulePath* = seq[Symbol]
|
2023-12-29 11:47:25 +00:00
|
|
|
Bundle* {.preservesRecord: "bundle".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`modules`*: Modules
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
CompoundPatternKind* {.pure.} = enum
|
|
|
|
`rec`, `tuple`, `tuplePrefix`, `dict`
|
2023-12-29 11:47:25 +00:00
|
|
|
CompoundPatternRec* {.preservesRecord: "rec".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`label`*: NamedPattern
|
|
|
|
`fields`*: NamedPattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
CompoundPatternTuple* {.preservesRecord: "tuple".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`patterns`*: seq[NamedPattern]
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
CompoundPatternTuplePrefix* {.preservesRecord: "tuplePrefix".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`fixed`*: seq[NamedPattern]
|
|
|
|
`variable`*: NamedSimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
CompoundPatternDict* {.preservesRecord: "dict".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`entries`*: DictionaryEntries
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-10-26 14:28:52 +00:00
|
|
|
`CompoundPattern`* {.acyclic, preservesOr.} = ref object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: CompoundPatternKind
|
|
|
|
of CompoundPatternKind.`rec`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`rec`*: CompoundPatternRec
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of CompoundPatternKind.`tuple`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`tuple`*: CompoundPatternTuple
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of CompoundPatternKind.`tuplePrefix`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`tupleprefix`*: CompoundPatternTuplePrefix
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of CompoundPatternKind.`dict`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`dict`*: CompoundPatternDict
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
|
|
|
Modules* = Table[ModulePath, Schema]
|
2021-09-27 13:58:36 +00:00
|
|
|
EmbeddedTypeNameKind* {.pure.} = enum
|
2022-12-08 07:53:11 +00:00
|
|
|
`false`, `Ref`
|
2021-10-17 12:50:27 +00:00
|
|
|
`EmbeddedTypeName`* {.preservesOr.} = object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: EmbeddedTypeNameKind
|
2021-11-11 10:11:40 +00:00
|
|
|
of EmbeddedTypeNameKind.`false`:
|
|
|
|
`false`* {.preservesLiteral: "#f".}: bool
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2021-09-27 13:58:36 +00:00
|
|
|
of EmbeddedTypeNameKind.`Ref`:
|
|
|
|
`ref`*: Ref
|
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2023-12-27 15:05:30 +00:00
|
|
|
Definitions* = Table[Symbol, Definition]
|
2022-02-19 16:33:16 +00:00
|
|
|
`AtomKind`* {.preservesOr, pure.} = enum
|
2021-09-27 13:58:36 +00:00
|
|
|
`Boolean`, `Float`, `Double`, `SignedInteger`, `String`, `ByteString`,
|
|
|
|
`Symbol`
|
2023-12-27 15:05:30 +00:00
|
|
|
DictionaryEntries* = Table[Value, NamedSimplePattern]
|
2021-09-27 13:58:36 +00:00
|
|
|
NamedPatternKind* {.pure.} = enum
|
|
|
|
`named`, `anonymous`
|
2023-10-26 14:28:52 +00:00
|
|
|
`NamedPattern`* {.acyclic, preservesOr.} = ref object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: NamedPatternKind
|
|
|
|
of NamedPatternKind.`named`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`named`*: Binding
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of NamedPatternKind.`anonymous`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`anonymous`*: Pattern
|
2021-11-11 10:11:40 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2021-09-27 13:58:36 +00:00
|
|
|
SimplePatternKind* {.pure.} = enum
|
|
|
|
`any`, `atom`, `embedded`, `lit`, `seqof`, `setof`, `dictof`, `Ref`
|
|
|
|
SimplePatternAtom* {.preservesRecord: "atom".} = object
|
|
|
|
`atomKind`*: AtomKind
|
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
SimplePatternEmbedded* {.preservesRecord: "embedded".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`interface`*: SimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
SimplePatternLit* {.preservesRecord: "lit".} = object
|
2023-12-27 15:05:30 +00:00
|
|
|
`value`*: Value
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
SimplePatternSeqof* {.preservesRecord: "seqof".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern`*: SimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
SimplePatternSetof* {.preservesRecord: "setof".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern`*: SimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
SimplePatternDictof* {.preservesRecord: "dictof".} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`key`*: SimplePattern
|
|
|
|
`value`*: SimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-10-26 14:28:52 +00:00
|
|
|
`SimplePattern`* {.acyclic, preservesOr.} = ref object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: SimplePatternKind
|
|
|
|
of SimplePatternKind.`any`:
|
|
|
|
`any`* {.preservesLiteral: "any".}: bool
|
|
|
|
|
|
|
|
of SimplePatternKind.`atom`:
|
|
|
|
`atom`*: SimplePatternAtom
|
|
|
|
|
|
|
|
of SimplePatternKind.`embedded`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`embedded`*: SimplePatternEmbedded
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of SimplePatternKind.`lit`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`lit`*: SimplePatternLit
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of SimplePatternKind.`seqof`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`seqof`*: SimplePatternSeqof
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of SimplePatternKind.`setof`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`setof`*: SimplePatternSetof
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of SimplePatternKind.`dictof`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`dictof`*: SimplePatternDictof
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of SimplePatternKind.`Ref`:
|
|
|
|
`ref`*: Ref
|
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2021-09-27 13:58:36 +00:00
|
|
|
NamedSimplePatternKind* {.pure.} = enum
|
|
|
|
`named`, `anonymous`
|
2023-12-29 11:47:25 +00:00
|
|
|
`NamedSimplePattern`* {.preservesOr.} = object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: NamedSimplePatternKind
|
|
|
|
of NamedSimplePatternKind.`named`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`named`*: Binding
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of NamedSimplePatternKind.`anonymous`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`anonymous`*: SimplePattern
|
2021-11-11 10:11:40 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2021-09-27 13:58:36 +00:00
|
|
|
DefinitionKind* {.pure.} = enum
|
|
|
|
`or`, `and`, `Pattern`
|
2023-12-29 11:47:25 +00:00
|
|
|
DefinitionOrField0* {.preservesTuple.} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern0`*: NamedAlternative
|
|
|
|
`pattern1`*: NamedAlternative
|
|
|
|
`patternN`* {.preservesTupleTail.}: seq[NamedAlternative]
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
DefinitionOr* {.preservesRecord: "or".} = object
|
2023-05-16 22:06:52 +00:00
|
|
|
`field0`*: DefinitionOrField0
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
DefinitionAndField0* {.preservesTuple.} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern0`*: NamedPattern
|
|
|
|
`pattern1`*: NamedPattern
|
|
|
|
`patternN`* {.preservesTupleTail.}: seq[NamedPattern]
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
DefinitionAnd* {.preservesRecord: "and".} = object
|
2023-05-16 22:06:52 +00:00
|
|
|
`field0`*: DefinitionAndField0
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
`Definition`* {.preservesOr.} = object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: DefinitionKind
|
|
|
|
of DefinitionKind.`or`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`or`*: DefinitionOr
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of DefinitionKind.`and`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`and`*: DefinitionAnd
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of DefinitionKind.`Pattern`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern`*: Pattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
NamedAlternative* {.preservesTuple.} = object
|
2021-09-27 13:58:36 +00:00
|
|
|
`variantLabel`*: string
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern`*: Pattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
SchemaField0* {.preservesDictionary.} = object
|
2022-12-08 07:53:11 +00:00
|
|
|
`definitions`*: Definitions
|
2023-10-26 14:28:52 +00:00
|
|
|
`embeddedType`*: EmbeddedTypeName
|
|
|
|
`version`* {.preservesLiteral: "1".}: tuple[]
|
2021-09-27 13:58:36 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
Schema* {.preservesRecord: "schema".} = object
|
2023-05-16 22:06:52 +00:00
|
|
|
`field0`*: SchemaField0
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
PatternKind* {.pure.} = enum
|
|
|
|
`SimplePattern`, `CompoundPattern`
|
2023-10-26 14:28:52 +00:00
|
|
|
`Pattern`* {.acyclic, preservesOr.} = ref object
|
2021-09-27 13:58:36 +00:00
|
|
|
case orKind*: PatternKind
|
|
|
|
of PatternKind.`SimplePattern`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`simplepattern`*: SimplePattern
|
2021-09-27 13:58:36 +00:00
|
|
|
|
|
|
|
of PatternKind.`CompoundPattern`:
|
2022-12-08 07:53:11 +00:00
|
|
|
`compoundpattern`*: CompoundPattern
|
2021-11-11 10:11:40 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
|
2023-12-29 11:47:25 +00:00
|
|
|
Binding* {.preservesRecord: "named".} = object
|
2022-02-20 04:33:15 +00:00
|
|
|
`name`*: Symbol
|
2022-12-08 07:53:11 +00:00
|
|
|
`pattern`*: SimplePattern
|
|
|
|
|
|
|
|
proc `$`*(x: Ref | ModulePath | Bundle | CompoundPattern | Modules |
|
|
|
|
EmbeddedTypeName |
|
|
|
|
Definitions |
|
|
|
|
DictionaryEntries |
|
|
|
|
NamedPattern |
|
|
|
|
SimplePattern |
|
|
|
|
NamedSimplePattern |
|
|
|
|
Definition |
|
|
|
|
NamedAlternative |
|
|
|
|
Schema |
|
|
|
|
Pattern |
|
|
|
|
Binding): string =
|
2023-12-27 15:05:30 +00:00
|
|
|
`$`(toPreserves(x))
|
2021-10-17 12:50:27 +00:00
|
|
|
|
2022-12-08 07:53:11 +00:00
|
|
|
proc encode*(x: Ref | ModulePath | Bundle | CompoundPattern | Modules |
|
|
|
|
EmbeddedTypeName |
|
|
|
|
Definitions |
|
|
|
|
DictionaryEntries |
|
|
|
|
NamedPattern |
|
|
|
|
SimplePattern |
|
|
|
|
NamedSimplePattern |
|
|
|
|
Definition |
|
|
|
|
NamedAlternative |
|
|
|
|
Schema |
|
|
|
|
Pattern |
|
|
|
|
Binding): seq[byte] =
|
2023-12-27 15:05:30 +00:00
|
|
|
encode(toPreserves(x))
|