syndicate-nim/src/sam/dataspaces.nim

53 lines
1.5 KiB
Nim
Raw Normal View History

2024-02-15 10:52:12 +00:00
# SPDX-FileCopyrightText: ☭ Emery Hemingway
2021-09-01 11:44:28 +00:00
# SPDX-License-Identifier: Unlicense
2024-01-01 18:18:30 +00:00
import std/[hashes, options, tables]
2024-02-15 10:52:12 +00:00
import pkg/cps
2021-07-08 09:50:13 +00:00
import preserves
2024-02-19 22:40:40 +00:00
import ./[actors, patterns, skeletons]
from ./protocols/protocol import Handle
2024-02-15 10:52:12 +00:00
from ./protocols/dataspace import Observe
type
2022-03-10 23:30:07 +00:00
Dataspace {.final.} = ref object of Entity
index: Index
2024-02-15 10:52:12 +00:00
handleMap: Table[Handle, Value]
2022-03-10 23:30:07 +00:00
2024-02-19 22:40:40 +00:00
proc dsPublish(e: Entity; v: Value; h: Handle) {.cps: Cont.} =
var ds = Dataspace(e)
if ds.index.add(v):
var obs = v.preservesTo(Observe)
2024-01-07 22:11:59 +00:00
if obs.isSome and obs.get.observer of Cap:
2024-02-19 22:40:40 +00:00
ds.index.add(obs.get.pattern, Cap(obs.get.observer))
ds.handleMap[h] = v
2022-03-10 23:30:07 +00:00
2024-02-19 22:40:40 +00:00
proc dsRetract(e: Entity; h: Handle) {.cps: Cont.} =
var ds = Dataspace(e)
var v = ds.handleMap[h]
if ds.index.remove(v):
2023-07-20 17:31:02 +00:00
ds.handleMap.del h
2024-01-01 18:18:30 +00:00
var obs = v.preservesTo(Observe)
2024-01-07 22:11:59 +00:00
if obs.isSome and obs.get.observer of Cap:
2024-02-19 22:40:40 +00:00
ds.index.remove(obs.get.pattern, Cap(obs.get.observer))
2021-09-24 19:25:47 +00:00
2024-02-19 22:40:40 +00:00
proc dsMessage(e: Entity; v: Value) {.cps: Cont.} =
var ds = Dataspace(e)
ds.index.deliverMessage(v)
2021-09-24 19:25:47 +00:00
2024-02-15 10:52:12 +00:00
proc newDataspace*(f: Facet): Cap =
2024-02-19 22:40:40 +00:00
var ds = Dataspace(
index: initIndex(),
2024-02-24 16:51:41 +00:00
).setActions(
publish = whelp dsPublish,
retract = whelp dsRetract,
message = whelp dsMessage,
2024-02-19 22:40:40 +00:00
)
newCap(f, ds)
2024-02-24 16:51:41 +00:00
proc observe*(cap: Cap; pat: Pattern; peer: Cap): Handle =
publish(cap, Observe(pattern: pat, observer: peer))
2024-02-19 22:40:40 +00:00
proc observe*(cap: Cap; pat: Pattern; e: Entity): Handle =
2024-02-24 16:51:41 +00:00
observe(cap, pat, newCap(cap.relay, e))