245 lines
6.4 KiB
Nim
245 lines
6.4 KiB
Nim
|
|
import
|
|
preserves, std/tables
|
|
|
|
type
|
|
PCompoundKind* {.pure.} = enum
|
|
`rec`, `arr`, `dict`
|
|
PCompoundRec*[Cap] {.acyclic, preservesRecord: "rec".} = ref object
|
|
`label`*: Preserve[Cap]
|
|
`fields`*: seq[Pattern[Cap]]
|
|
|
|
PCompoundArr*[Cap] {.acyclic, preservesRecord: "arr".} = ref object
|
|
`items`*: seq[Pattern[Cap]]
|
|
|
|
PCompoundDict*[Cap] {.acyclic, preservesRecord: "dict".} = ref object
|
|
`entries`*: Table[Preserve[Cap], Pattern[Cap]]
|
|
|
|
`PCompound`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: PCompoundKind
|
|
of PCompoundKind.`rec`:
|
|
`rec`*: PCompoundRec[Cap]
|
|
|
|
of PCompoundKind.`arr`:
|
|
`arr`*: PCompoundArr[Cap]
|
|
|
|
of PCompoundKind.`dict`:
|
|
`dict`*: PCompoundDict[Cap]
|
|
|
|
|
|
Reject*[Cap] {.acyclic, preservesRecord: "reject".} = ref object
|
|
`pattern`*: Pattern[Cap]
|
|
|
|
CaveatsFieldKind* {.pure.} = enum
|
|
`present`, `invalid`, `absent`
|
|
CaveatsFieldPresent*[Cap] {.acyclic, preservesDictionary.} = ref object
|
|
`caveats`*: seq[Caveat[Cap]]
|
|
|
|
CaveatsFieldInvalid*[Cap] {.preservesDictionary.} = object
|
|
`caveats`*: Preserve[Cap]
|
|
|
|
CaveatsFieldAbsent* {.preservesDictionary.} = object
|
|
|
|
`CaveatsField`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: CaveatsFieldKind
|
|
of CaveatsFieldKind.`present`:
|
|
`present`*: CaveatsFieldPresent[Cap]
|
|
|
|
of CaveatsFieldKind.`invalid`:
|
|
`invalid`*: CaveatsFieldInvalid[Cap]
|
|
|
|
of CaveatsFieldKind.`absent`:
|
|
`absent`*: CaveatsFieldAbsent
|
|
|
|
|
|
SturdyDescriptionDetail*[Cap] {.preservesDictionary.} = object
|
|
`key`*: seq[byte]
|
|
`oid`*: Preserve[Cap]
|
|
|
|
PAnd*[Cap] {.acyclic, preservesRecord: "and".} = ref object
|
|
`patterns`*: seq[Pattern[Cap]]
|
|
|
|
SturdyStepDetail*[Cap] = Parameters[Cap]
|
|
Rewrite*[Cap] {.acyclic, preservesRecord: "rewrite".} = ref object
|
|
`pattern`*: Pattern[Cap]
|
|
`template`*: Template[Cap]
|
|
|
|
Parameters*[Cap] = Preserve[Cap]
|
|
TRef* {.preservesRecord: "ref".} = object
|
|
`binding`*: BiggestInt
|
|
|
|
PBind*[Cap] {.acyclic, preservesRecord: "bind".} = ref object
|
|
`pattern`*: Pattern[Cap]
|
|
|
|
Lit*[Cap] {.preservesRecord: "lit".} = object
|
|
`value`*: Preserve[Cap]
|
|
|
|
TCompoundKind* {.pure.} = enum
|
|
`rec`, `arr`, `dict`
|
|
TCompoundRec*[Cap] {.acyclic, preservesRecord: "rec".} = ref object
|
|
`label`*: Preserve[Cap]
|
|
`fields`*: seq[Template[Cap]]
|
|
|
|
TCompoundArr*[Cap] {.acyclic, preservesRecord: "arr".} = ref object
|
|
`items`*: seq[Template[Cap]]
|
|
|
|
TCompoundDict*[Cap] {.acyclic, preservesRecord: "dict".} = ref object
|
|
`entries`*: Table[Preserve[Cap], Template[Cap]]
|
|
|
|
`TCompound`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: TCompoundKind
|
|
of TCompoundKind.`rec`:
|
|
`rec`*: TCompoundRec[Cap]
|
|
|
|
of TCompoundKind.`arr`:
|
|
`arr`*: TCompoundArr[Cap]
|
|
|
|
of TCompoundKind.`dict`:
|
|
`dict`*: TCompoundDict[Cap]
|
|
|
|
|
|
SturdyPathStepDetail*[Cap] = Parameters[Cap]
|
|
`PAtom`* {.preservesOr, pure.} = enum
|
|
`Boolean`, `Float`, `Double`, `SignedInteger`, `String`, `ByteString`,
|
|
`Symbol`
|
|
PDiscard* {.preservesRecord: "_".} = object
|
|
|
|
TemplateKind* {.pure.} = enum
|
|
`TAttenuate`, `TRef`, `Lit`, `TCompound`
|
|
`Template`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: TemplateKind
|
|
of TemplateKind.`TAttenuate`:
|
|
`tattenuate`*: TAttenuate[Cap]
|
|
|
|
of TemplateKind.`TRef`:
|
|
`tref`*: TRef
|
|
|
|
of TemplateKind.`Lit`:
|
|
`lit`*: Lit[Cap]
|
|
|
|
of TemplateKind.`TCompound`:
|
|
`tcompound`*: TCompound[Cap]
|
|
|
|
|
|
CaveatKind* {.pure.} = enum
|
|
`Rewrite`, `Alts`, `Reject`, `unknown`
|
|
CaveatUnknown*[Cap] = Preserve[Cap]
|
|
`Caveat`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: CaveatKind
|
|
of CaveatKind.`Rewrite`:
|
|
`rewrite`*: Rewrite[Cap]
|
|
|
|
of CaveatKind.`Alts`:
|
|
`alts`*: Alts[Cap]
|
|
|
|
of CaveatKind.`Reject`:
|
|
`reject`*: Reject[Cap]
|
|
|
|
of CaveatKind.`unknown`:
|
|
`unknown`*: CaveatUnknown[Cap]
|
|
|
|
|
|
PNot*[Cap] {.acyclic, preservesRecord: "not".} = ref object
|
|
`pattern`*: Pattern[Cap]
|
|
|
|
SturdyRef*[Cap] {.acyclic, preservesRecord: "ref".} = ref object
|
|
`parameters`*: Parameters[Cap]
|
|
|
|
WireRefKind* {.pure.} = enum
|
|
`mine`, `yours`
|
|
WireRefMine* {.preservesTuple.} = object
|
|
`field0`* {.preservesLiteral: "0".}: tuple[]
|
|
`oid`*: Oid
|
|
|
|
WireRefYours*[Cap] {.acyclic, preservesTuple.} = ref object
|
|
`field0`* {.preservesLiteral: "1".}: tuple[]
|
|
`oid`*: Oid
|
|
`attenuation`* {.preservesTupleTail.}: seq[Caveat[Cap]]
|
|
|
|
`WireRef`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: WireRefKind
|
|
of WireRefKind.`mine`:
|
|
`mine`*: WireRefMine
|
|
|
|
of WireRefKind.`yours`:
|
|
`yours`*: WireRefYours[Cap]
|
|
|
|
|
|
TAttenuate*[Cap] {.acyclic, preservesRecord: "attenuate".} = ref object
|
|
`template`*: Template[Cap]
|
|
`attenuation`*: seq[Caveat[Cap]]
|
|
|
|
Oid* = BiggestInt
|
|
Alts*[Cap] {.acyclic, preservesRecord: "or".} = ref object
|
|
`alternatives`*: seq[Rewrite[Cap]]
|
|
|
|
PatternKind* {.pure.} = enum
|
|
`PDiscard`, `PAtom`, `PEmbedded`, `PBind`, `PAnd`, `PNot`, `Lit`,
|
|
`PCompound`
|
|
`Pattern`*[Cap] {.acyclic, preservesOr.} = ref object
|
|
case orKind*: PatternKind
|
|
of PatternKind.`PDiscard`:
|
|
`pdiscard`*: PDiscard
|
|
|
|
of PatternKind.`PAtom`:
|
|
`patom`*: PAtom
|
|
|
|
of PatternKind.`PEmbedded`:
|
|
`pembedded`* {.preservesLiteral: "Embedded".}: bool
|
|
|
|
of PatternKind.`PBind`:
|
|
`pbind`*: PBind[Cap]
|
|
|
|
of PatternKind.`PAnd`:
|
|
`pand`*: PAnd[Cap]
|
|
|
|
of PatternKind.`PNot`:
|
|
`pnot`*: PNot[Cap]
|
|
|
|
of PatternKind.`Lit`:
|
|
`lit`*: Lit[Cap]
|
|
|
|
of PatternKind.`PCompound`:
|
|
`pcompound`*: PCompound[Cap]
|
|
|
|
|
|
proc `$`*[Cap](x: PCompound[Cap] | Reject[Cap] | CaveatsField[Cap] |
|
|
SturdyDescriptionDetail[Cap] |
|
|
PAnd[Cap] |
|
|
Rewrite[Cap] |
|
|
PBind[Cap] |
|
|
Lit[Cap] |
|
|
TCompound[Cap] |
|
|
Template[Cap] |
|
|
Caveat[Cap] |
|
|
PNot[Cap] |
|
|
SturdyRef[Cap] |
|
|
WireRef[Cap] |
|
|
TAttenuate[Cap] |
|
|
Alts[Cap] |
|
|
Pattern[Cap]): string =
|
|
`$`(toPreserve(x, Cap))
|
|
|
|
proc encode*[Cap](x: PCompound[Cap] | Reject[Cap] | CaveatsField[Cap] |
|
|
SturdyDescriptionDetail[Cap] |
|
|
PAnd[Cap] |
|
|
Rewrite[Cap] |
|
|
PBind[Cap] |
|
|
Lit[Cap] |
|
|
TCompound[Cap] |
|
|
Template[Cap] |
|
|
Caveat[Cap] |
|
|
PNot[Cap] |
|
|
SturdyRef[Cap] |
|
|
WireRef[Cap] |
|
|
TAttenuate[Cap] |
|
|
Alts[Cap] |
|
|
Pattern[Cap]): seq[byte] =
|
|
encode(toPreserve(x, Cap))
|
|
|
|
proc `$`*(x: TRef | PDiscard | Oid): string =
|
|
`$`(toPreserve(x))
|
|
|
|
proc encode*(x: TRef | PDiscard | Oid): seq[byte] =
|
|
encode(toPreserve(x))
|