syndicate-nim/src/syndicate/protocols/sturdy.nim

203 lines
5.1 KiB
Nim
Raw Normal View History

import
2022-12-08 08:15:01 +00:00
std/typetraits, preserves, std/tables, std/tables
type
PCompoundKind* {.pure.} = enum
`rec`, `arr`, `dict`
2022-12-08 08:15:01 +00:00
PCompoundRec*[Cap] {.preservesRecord: "rec".} = ref object
`label`*: Preserve[Cap]
`fields`*: seq[Pattern[Cap]]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
PCompoundArr*[Cap] {.preservesRecord: "arr".} = ref object
`items`*: seq[Pattern[Cap]]
2022-12-08 08:15:01 +00:00
PCompoundDict*[Cap] {.preservesRecord: "dict".} = ref object
`entries`*: Table[Preserve[Cap], Pattern[Cap]]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
`PCompound`*[Cap] {.preservesOr.} = ref object
case orKind*: PCompoundKind
of PCompoundKind.`rec`:
2022-12-08 08:15:01 +00:00
`rec`*: PCompoundRec[Cap]
of PCompoundKind.`arr`:
2022-12-08 08:15:01 +00:00
`arr`*: PCompoundArr[Cap]
of PCompoundKind.`dict`:
2022-12-08 08:15:01 +00:00
`dict`*: PCompoundDict[Cap]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
PAnd*[Cap] {.preservesRecord: "and".} = ref object
`patterns`*: seq[Pattern[Cap]]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
Rewrite*[Cap] {.preservesRecord: "rewrite".} = ref object
`pattern`*: Pattern[Cap]
`template`*: Template[Cap]
2021-09-24 19:25:47 +00:00
TRef* {.preservesRecord: "ref".} = object
2022-07-08 12:49:24 +00:00
`binding`*: BiggestInt
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
PBind*[Cap] {.preservesRecord: "bind".} = ref object
`pattern`*: Pattern[Cap]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
Lit*[Cap] {.preservesRecord: "lit".} = object
`value`*: Preserve[Cap]
2021-09-24 19:25:47 +00:00
TCompoundKind* {.pure.} = enum
`rec`, `arr`, `dict`
2022-12-08 08:15:01 +00:00
TCompoundRec*[Cap] {.preservesRecord: "rec".} = ref object
`label`*: Preserve[Cap]
`fields`*: seq[Template[Cap]]
2022-12-08 08:15:01 +00:00
TCompoundArr*[Cap] {.preservesRecord: "arr".} = ref object
`items`*: seq[Template[Cap]]
2022-12-08 08:15:01 +00:00
TCompoundDict*[Cap] {.preservesRecord: "dict".} = ref object
`entries`*: Table[Preserve[Cap], Template[Cap]]
2022-12-08 08:15:01 +00:00
`TCompound`*[Cap] {.preservesOr.} = ref object
case orKind*: TCompoundKind
of TCompoundKind.`rec`:
2022-12-08 08:15:01 +00:00
`rec`*: TCompoundRec[Cap]
of TCompoundKind.`arr`:
2022-12-08 08:15:01 +00:00
`arr`*: TCompoundArr[Cap]
2021-09-24 19:25:47 +00:00
of TCompoundKind.`dict`:
2022-12-08 08:15:01 +00:00
`dict`*: TCompoundDict[Cap]
2022-12-08 08:15:01 +00:00
`PAtom`* {.preservesOr, pure.} = enum
2021-09-24 19:25:47 +00:00
`Boolean`, `Float`, `Double`, `SignedInteger`, `String`, `ByteString`,
`Symbol`
2022-12-08 08:15:01 +00:00
Attenuation*[Cap] = seq[Caveat[Cap]]
2021-09-24 19:25:47 +00:00
PDiscard* {.preservesRecord: "_".} = object
2022-12-08 08:15:01 +00:00
2021-09-24 19:25:47 +00:00
TemplateKind* {.pure.} = enum
`TAttenuate`, `TRef`, `Lit`, `TCompound`
2022-12-08 08:15:01 +00:00
`Template`*[Cap] {.preservesOr.} = ref object
2021-09-24 19:25:47 +00:00
case orKind*: TemplateKind
of TemplateKind.`TAttenuate`:
2022-12-08 08:15:01 +00:00
`tattenuate`*: TAttenuate[Cap]
2021-09-24 19:25:47 +00:00
of TemplateKind.`TRef`:
`tref`*: TRef
of TemplateKind.`Lit`:
2022-12-08 08:15:01 +00:00
`lit`*: Lit[Cap]
2021-09-24 19:25:47 +00:00
of TemplateKind.`TCompound`:
2022-12-08 08:15:01 +00:00
`tcompound`*: TCompound[Cap]
2022-12-08 08:15:01 +00:00
CaveatKind* {.pure.} = enum
`Rewrite`, `Alts`
2022-12-08 08:15:01 +00:00
`Caveat`*[Cap] {.preservesOr.} = ref object
2021-09-24 19:25:47 +00:00
case orKind*: CaveatKind
of CaveatKind.`Rewrite`:
2022-12-08 08:15:01 +00:00
`rewrite`*: Rewrite[Cap]
of CaveatKind.`Alts`:
2022-12-08 08:15:01 +00:00
`alts`*: Alts[Cap]
2021-09-24 19:25:47 +00:00
2022-12-08 08:15:01 +00:00
PNot*[Cap] {.preservesRecord: "not".} = ref object
`pattern`*: Pattern[Cap]
2022-12-08 08:15:01 +00:00
SturdyRef*[Cap] {.preservesRecord: "ref".} = ref object
`oid`*: Preserve[Cap]
`caveatChain`*: seq[Attenuation[Cap]]
2021-09-24 19:25:47 +00:00
`sig`*: seq[byte]
2021-09-24 19:25:47 +00:00
WireRefKind* {.pure.} = enum
`mine`, `yours`
2021-09-24 19:25:47 +00:00
WireRefMine* {.preservesTuple.} = object
2023-05-06 19:22:21 +00:00
`field0`* {.preservesLiteral: "0".}: tuple[]
2021-09-24 19:25:47 +00:00
`oid`*: Oid
2022-12-08 08:15:01 +00:00
WireRefYours*[Cap] {.preservesTuple.} = ref object
2023-05-06 19:22:21 +00:00
`field0`* {.preservesLiteral: "1".}: tuple[]
2021-09-24 19:25:47 +00:00
`oid`*: Oid
2022-12-08 08:15:01 +00:00
`attenuation`* {.preservesTupleTail.}: seq[Caveat[Cap]]
2022-12-08 08:15:01 +00:00
`WireRef`*[Cap] {.preservesOr.} = ref object
2021-09-24 19:25:47 +00:00
case orKind*: WireRefKind
of WireRefKind.`mine`:
`mine`*: WireRefMine
2021-09-24 19:25:47 +00:00
of WireRefKind.`yours`:
2022-12-08 08:15:01 +00:00
`yours`*: WireRefYours[Cap]
2022-07-08 12:49:24 +00:00
2022-12-08 08:15:01 +00:00
TAttenuate*[Cap] {.preservesRecord: "attenuate".} = ref object
`template`*: Template[Cap]
`attenuation`*: Attenuation[Cap]
2022-07-08 12:49:24 +00:00
Oid* = BiggestInt
2022-12-08 08:15:01 +00:00
Alts*[Cap] {.preservesRecord: "or".} = ref object
`alternatives`*: seq[Rewrite[Cap]]
PatternKind* {.pure.} = enum
2021-09-24 19:25:47 +00:00
`PDiscard`, `PAtom`, `PEmbedded`, `PBind`, `PAnd`, `PNot`, `Lit`,
`PCompound`
2022-12-08 08:15:01 +00:00
`Pattern`*[Cap] {.preservesOr.} = ref object
2021-09-24 19:25:47 +00:00
case orKind*: PatternKind
of PatternKind.`PDiscard`:
`pdiscard`*: PDiscard
2021-09-24 19:25:47 +00:00
of PatternKind.`PAtom`:
`patom`*: PAtom
2021-09-24 19:25:47 +00:00
of PatternKind.`PEmbedded`:
`pembedded`* {.preservesLiteral: "Embedded".}: bool
2021-09-24 19:25:47 +00:00
of PatternKind.`PBind`:
2022-12-08 08:15:01 +00:00
`pbind`*: PBind[Cap]
2021-09-24 19:25:47 +00:00
of PatternKind.`PAnd`:
2022-12-08 08:15:01 +00:00
`pand`*: PAnd[Cap]
2021-09-24 19:25:47 +00:00
of PatternKind.`PNot`:
2022-12-08 08:15:01 +00:00
`pnot`*: PNot[Cap]
of PatternKind.`Lit`:
2022-12-08 08:15:01 +00:00
`lit`*: Lit[Cap]
2021-09-24 19:25:47 +00:00
of PatternKind.`PCompound`:
2022-12-08 08:15:01 +00:00
`pcompound`*: PCompound[Cap]
proc `$`*[Cap](x: PCompound[Cap] | PAnd[Cap] | Rewrite[Cap] | PBind[Cap] |
Lit[Cap] |
TCompound[Cap] |
Attenuation[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] | PAnd[Cap] | Rewrite[Cap] | PBind[Cap] |
Lit[Cap] |
TCompound[Cap] |
Attenuation[Cap] |
Template[Cap] |
Caveat[Cap] |
PNot[Cap] |
SturdyRef[Cap] |
WireRef[Cap] |
TAttenuate[Cap] |
Alts[Cap] |
Pattern[Cap]): seq[byte] =
encode(toPreserve(x, Cap))
2021-09-24 19:25:47 +00:00
proc `$`*(x: TRef | PDiscard | Oid): string =
2021-09-24 19:25:47 +00:00
`$`(toPreserve(x))
proc encode*(x: TRef | PDiscard | Oid): seq[byte] =
2021-09-24 19:25:47 +00:00
encode(toPreserve(x))