2022-03-07 19:15:32 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ 2022 Emery Hemingway
|
|
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
|
2022-10-17 05:26:12 +00:00
|
|
|
import std/[hashes, tables]
|
2022-03-07 19:15:32 +00:00
|
|
|
|
|
|
|
from ./actors import Ref, hash
|
|
|
|
from ./protocols/sturdy import Oid
|
|
|
|
|
|
|
|
proc hash(r: Ref): Hash = !$(r.relay.hash !& r.target.unsafeAddr.hash)
|
|
|
|
|
|
|
|
type
|
|
|
|
Membrane* = object
|
|
|
|
## Bidirectional mapping between `Oid` and `Ref` 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]
|
|
|
|
byRef: Table[Ref, WireSymbol]
|
|
|
|
|
|
|
|
WireSymbol* = ref object
|
|
|
|
oid: Oid
|
|
|
|
`ref`: Ref
|
|
|
|
count: int
|
|
|
|
|
|
|
|
proc oid*(sym: WireSymbol): Oid = sym.oid
|
|
|
|
proc `ref`*(sym: WireSymbol): Ref = sym.ref
|
|
|
|
|
2022-06-16 18:03:15 +00:00
|
|
|
proc grab*(mem: Membrane; key: Oid): WireSymbol =
|
2022-03-07 19:15:32 +00:00
|
|
|
## Grab a `WireSymbol` from a `Membrane`.
|
2022-06-16 18:03:15 +00:00
|
|
|
mem.byOid.getOrDefault(key)
|
|
|
|
|
|
|
|
proc grab*(mem: Membrane; key: Ref): WireSymbol =
|
|
|
|
## Grab a `WireSymbol` from a `Membrane`.
|
|
|
|
mem.byRef.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
|
|
|
|
mem.byRef.del sym.`ref`
|
|
|
|
|
|
|
|
proc newWireSymbol*(mem: var Membrane; o: Oid; r: Ref): WireSymbol =
|
|
|
|
## Allocate a `WireSymbol` at a `Membrane`.
|
2022-03-16 15:34:29 +00:00
|
|
|
result = WireSymbol(oid: o, `ref`: r, count: 1)
|
2022-03-07 19:15:32 +00:00
|
|
|
mem.byOid[result.oid] = result
|
|
|
|
mem.byRef[result.`ref`] = result
|