|
|
|
@ -1,5 +1,6 @@
|
|
|
|
|
|
|
|
|
|
import ../preserves, std/tables
|
|
|
|
|
import
|
|
|
|
|
preserves, std/tables
|
|
|
|
|
|
|
|
|
|
type
|
|
|
|
|
Ref* {.preservesRecord: "ref".} = object
|
|
|
|
@ -7,26 +8,26 @@ type
|
|
|
|
|
`name`*: Symbol
|
|
|
|
|
|
|
|
|
|
ModulePath* = seq[Symbol]
|
|
|
|
|
Bundle* {.preservesRecord: "bundle".} = ref object
|
|
|
|
|
Bundle* {.acyclic, preservesRecord: "bundle".} = ref object
|
|
|
|
|
`modules`*: Modules
|
|
|
|
|
|
|
|
|
|
CompoundPatternKind* {.pure.} = enum
|
|
|
|
|
`rec`, `tuple`, `tuplePrefix`, `dict`
|
|
|
|
|
CompoundPatternRec* {.preservesRecord: "rec".} = ref object
|
|
|
|
|
CompoundPatternRec* {.acyclic, preservesRecord: "rec".} = ref object
|
|
|
|
|
`label`*: NamedPattern
|
|
|
|
|
`fields`*: NamedPattern
|
|
|
|
|
|
|
|
|
|
CompoundPatternTuple* {.preservesRecord: "tuple".} = ref object
|
|
|
|
|
CompoundPatternTuple* {.acyclic, preservesRecord: "tuple".} = ref object
|
|
|
|
|
`patterns`*: seq[NamedPattern]
|
|
|
|
|
|
|
|
|
|
CompoundPatternTuplePrefix* {.preservesRecord: "tuplePrefix".} = ref object
|
|
|
|
|
CompoundPatternTuplePrefix* {.acyclic, preservesRecord: "tuplePrefix".} = ref object
|
|
|
|
|
`fixed`*: seq[NamedPattern]
|
|
|
|
|
`variable`*: NamedSimplePattern
|
|
|
|
|
|
|
|
|
|
CompoundPatternDict* {.preservesRecord: "dict".} = ref object
|
|
|
|
|
CompoundPatternDict* {.acyclic, preservesRecord: "dict".} = ref object
|
|
|
|
|
`entries`*: DictionaryEntries
|
|
|
|
|
|
|
|
|
|
`CompoundPattern`* {.preservesOr.} = ref object
|
|
|
|
|
`CompoundPattern`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: CompoundPatternKind
|
|
|
|
|
of CompoundPatternKind.`rec`:
|
|
|
|
|
`rec`*: CompoundPatternRec
|
|
|
|
@ -60,7 +61,7 @@ type
|
|
|
|
|
DictionaryEntries* = Table[Preserve[void], NamedSimplePattern]
|
|
|
|
|
NamedPatternKind* {.pure.} = enum
|
|
|
|
|
`named`, `anonymous`
|
|
|
|
|
`NamedPattern`* {.preservesOr.} = ref object
|
|
|
|
|
`NamedPattern`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: NamedPatternKind
|
|
|
|
|
of NamedPatternKind.`named`:
|
|
|
|
|
`named`*: Binding
|
|
|
|
@ -74,23 +75,23 @@ type
|
|
|
|
|
SimplePatternAtom* {.preservesRecord: "atom".} = object
|
|
|
|
|
`atomKind`*: AtomKind
|
|
|
|
|
|
|
|
|
|
SimplePatternEmbedded* {.preservesRecord: "embedded".} = ref object
|
|
|
|
|
SimplePatternEmbedded* {.acyclic, preservesRecord: "embedded".} = ref object
|
|
|
|
|
`interface`*: SimplePattern
|
|
|
|
|
|
|
|
|
|
SimplePatternLit* {.preservesRecord: "lit".} = object
|
|
|
|
|
`value`*: Preserve[void]
|
|
|
|
|
|
|
|
|
|
SimplePatternSeqof* {.preservesRecord: "seqof".} = ref object
|
|
|
|
|
SimplePatternSeqof* {.acyclic, preservesRecord: "seqof".} = ref object
|
|
|
|
|
`pattern`*: SimplePattern
|
|
|
|
|
|
|
|
|
|
SimplePatternSetof* {.preservesRecord: "setof".} = ref object
|
|
|
|
|
SimplePatternSetof* {.acyclic, preservesRecord: "setof".} = ref object
|
|
|
|
|
`pattern`*: SimplePattern
|
|
|
|
|
|
|
|
|
|
SimplePatternDictof* {.preservesRecord: "dictof".} = ref object
|
|
|
|
|
SimplePatternDictof* {.acyclic, preservesRecord: "dictof".} = ref object
|
|
|
|
|
`key`*: SimplePattern
|
|
|
|
|
`value`*: SimplePattern
|
|
|
|
|
|
|
|
|
|
`SimplePattern`* {.preservesOr.} = ref object
|
|
|
|
|
`SimplePattern`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: SimplePatternKind
|
|
|
|
|
of SimplePatternKind.`any`:
|
|
|
|
|
`any`* {.preservesLiteral: "any".}: bool
|
|
|
|
@ -119,7 +120,7 @@ type
|
|
|
|
|
|
|
|
|
|
NamedSimplePatternKind* {.pure.} = enum
|
|
|
|
|
`named`, `anonymous`
|
|
|
|
|
`NamedSimplePattern`* {.preservesOr.} = ref object
|
|
|
|
|
`NamedSimplePattern`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: NamedSimplePatternKind
|
|
|
|
|
of NamedSimplePatternKind.`named`:
|
|
|
|
|
`named`*: Binding
|
|
|
|
@ -130,23 +131,23 @@ type
|
|
|
|
|
|
|
|
|
|
DefinitionKind* {.pure.} = enum
|
|
|
|
|
`or`, `and`, `Pattern`
|
|
|
|
|
DefinitionOrField0* {.preservesTuple.} = ref object
|
|
|
|
|
DefinitionOrField0* {.acyclic, preservesTuple.} = ref object
|
|
|
|
|
`pattern0`*: NamedAlternative
|
|
|
|
|
`pattern1`*: NamedAlternative
|
|
|
|
|
`patternN`* {.preservesTupleTail.}: seq[NamedAlternative]
|
|
|
|
|
|
|
|
|
|
DefinitionOr* {.preservesRecord: "or".} = ref object
|
|
|
|
|
DefinitionOr* {.acyclic, preservesRecord: "or".} = ref object
|
|
|
|
|
`field0`*: DefinitionOrField0
|
|
|
|
|
|
|
|
|
|
DefinitionAndField0* {.preservesTuple.} = ref object
|
|
|
|
|
DefinitionAndField0* {.acyclic, preservesTuple.} = ref object
|
|
|
|
|
`pattern0`*: NamedPattern
|
|
|
|
|
`pattern1`*: NamedPattern
|
|
|
|
|
`patternN`* {.preservesTupleTail.}: seq[NamedPattern]
|
|
|
|
|
|
|
|
|
|
DefinitionAnd* {.preservesRecord: "and".} = ref object
|
|
|
|
|
DefinitionAnd* {.acyclic, preservesRecord: "and".} = ref object
|
|
|
|
|
`field0`*: DefinitionAndField0
|
|
|
|
|
|
|
|
|
|
`Definition`* {.preservesOr.} = ref object
|
|
|
|
|
`Definition`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: DefinitionKind
|
|
|
|
|
of DefinitionKind.`or`:
|
|
|
|
|
`or`*: DefinitionOr
|
|
|
|
@ -158,21 +159,21 @@ type
|
|
|
|
|
`pattern`*: Pattern
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NamedAlternative* {.preservesTuple.} = ref object
|
|
|
|
|
NamedAlternative* {.acyclic, preservesTuple.} = ref object
|
|
|
|
|
`variantLabel`*: string
|
|
|
|
|
`pattern`*: Pattern
|
|
|
|
|
|
|
|
|
|
SchemaField0* {.preservesDictionary.} = ref object
|
|
|
|
|
`version`* {.preservesLiteral: "1".}: tuple[]
|
|
|
|
|
`embeddedType`*: EmbeddedTypeName
|
|
|
|
|
SchemaField0* {.acyclic, preservesDictionary.} = ref object
|
|
|
|
|
`definitions`*: Definitions
|
|
|
|
|
`embeddedType`*: EmbeddedTypeName
|
|
|
|
|
`version`* {.preservesLiteral: "1".}: tuple[]
|
|
|
|
|
|
|
|
|
|
Schema* {.preservesRecord: "schema".} = ref object
|
|
|
|
|
Schema* {.acyclic, preservesRecord: "schema".} = ref object
|
|
|
|
|
`field0`*: SchemaField0
|
|
|
|
|
|
|
|
|
|
PatternKind* {.pure.} = enum
|
|
|
|
|
`SimplePattern`, `CompoundPattern`
|
|
|
|
|
`Pattern`* {.preservesOr.} = ref object
|
|
|
|
|
`Pattern`* {.acyclic, preservesOr.} = ref object
|
|
|
|
|
case orKind*: PatternKind
|
|
|
|
|
of PatternKind.`SimplePattern`:
|
|
|
|
|
`simplepattern`*: SimplePattern
|
|
|
|
@ -181,7 +182,7 @@ type
|
|
|
|
|
`compoundpattern`*: CompoundPattern
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Binding* {.preservesRecord: "named".} = ref object
|
|
|
|
|
Binding* {.acyclic, preservesRecord: "named".} = ref object
|
|
|
|
|
`name`*: Symbol
|
|
|
|
|
`pattern`*: SimplePattern
|
|
|
|
|
|
|
|
|
|