2024-02-15 10:52:12 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
2021-09-01 11:44:28 +00:00
|
|
|
# SPDX-License-Identifier: Unlicense
|
2021-06-24 15:50:27 +00:00
|
|
|
|
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]
|
2021-06-24 15:50:27 +00:00
|
|
|
|
2021-11-02 11:58:51 +00:00
|
|
|
from ./protocols/protocol import Handle
|
2024-02-15 10:52:12 +00:00
|
|
|
from ./protocols/dataspace import Observe
|
2021-06-24 15:50:27 +00:00
|
|
|
|
|
|
|
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))
|