syndicate-nim/src/syndicate/membranes.nim

46 lines
1.3 KiB
Nim
Raw Normal View History

2022-03-07 19:15:32 +00:00
# SPDX-FileCopyrightText: ☭ 2022 Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[hashes, tables]
2022-03-07 19:15:32 +00:00
2023-07-24 15:13:36 +00:00
from ./actors import Cap, hash
2022-03-07 19:15:32 +00:00
from ./protocols/sturdy import Oid
2023-07-24 15:13:36 +00:00
proc hash(r: Cap): Hash = !$(r.relay.hash !& r.target.unsafeAddr.hash)
2022-03-07 19:15:32 +00:00
type
Membrane* = object
2023-07-24 15:13:36 +00:00
## Bidirectional mapping between `Oid` and `Cap` values.
2023-05-18 10:20:44 +00:00
## https://synit.org/book/protocol.html#membranes
2022-03-07 19:15:32 +00:00
byOid: Table[Oid, WireSymbol]
2023-07-24 15:13:36 +00:00
byCap: Table[Cap, WireSymbol]
2022-03-07 19:15:32 +00:00
WireSymbol* = ref object
oid: Oid
2023-07-24 15:13:36 +00:00
cap: Cap
2022-03-07 19:15:32 +00:00
count: int
proc oid*(sym: WireSymbol): Oid = sym.oid
2023-07-24 15:13:36 +00:00
proc cap*(sym: WireSymbol): Cap = sym.cap
2022-03-07 19:15:32 +00:00
proc grab*(mem: Membrane; key: Oid): WireSymbol =
2022-03-07 19:15:32 +00:00
## Grab a `WireSymbol` from a `Membrane`.
mem.byOid.getOrDefault(key)
2023-07-24 15:13:36 +00:00
proc grab*(mem: Membrane; key: Cap): WireSymbol =
## Grab a `WireSymbol` from a `Membrane`.
2023-07-24 15:13:36 +00:00
mem.byCap.getOrDefault(key)
2022-03-07 19:15:32 +00:00
proc drop*(mem: var Membrane; sym: WireSymbol) =
## Drop a `WireSymbol` from a `Membrane`.
dec sym.count
if sym.count < 1:
mem.byOid.del sym.oid
2023-07-24 15:13:36 +00:00
mem.byCap.del sym.cap
2022-03-07 19:15:32 +00:00
2023-07-24 15:13:36 +00:00
proc newWireSymbol*(mem: var Membrane; o: Oid; r: Cap): WireSymbol =
2022-03-07 19:15:32 +00:00
## Allocate a `WireSymbol` at a `Membrane`.
2023-07-24 15:13:36 +00:00
result = WireSymbol(oid: o, cap: r, count: 1)
2022-03-07 19:15:32 +00:00
mem.byOid[result.oid] = result
2023-07-24 15:13:36 +00:00
mem.byCap[result.cap] = result