2024-04-24 14:15:13 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
|
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
|
|
|
|
import
|
|
|
|
min,
|
|
|
|
preserves,
|
|
|
|
syndicate,
|
|
|
|
./min_preserves
|
|
|
|
|
|
|
|
const
|
|
|
|
capType* = "syndicate-cap"
|
|
|
|
dictCapType = "dict:" & capType
|
|
|
|
|
|
|
|
proc discardTurn(turn: var Turn) = discard
|
|
|
|
|
|
|
|
proc newCapDict(i: In): MinValue =
|
|
|
|
result = i.scope.newDict
|
|
|
|
result.objType = capType
|
|
|
|
|
|
|
|
proc getCap(q: MinValue): Cap =
|
|
|
|
assert q.objType == capType
|
|
|
|
cast[Cap](q.obj)
|
|
|
|
|
|
|
|
proc setCap(q: MinValue; cap: Cap) =
|
|
|
|
q.obj = addr cap[]
|
|
|
|
|
|
|
|
proc runForObj(q: MinValue) =
|
|
|
|
while q.obj.isNil:
|
|
|
|
syndicate.runOnce()
|
|
|
|
|
|
|
|
proc syndicate_module*(i: In) =
|
|
|
|
let def = i.define()
|
|
|
|
|
|
|
|
def.symbol("dataspace") do (i: In):
|
|
|
|
let
|
2024-04-25 07:35:16 +00:00
|
|
|
vals = i.expect("dict")
|
2024-04-24 14:15:13 +00:00
|
|
|
dict = i.newCapDict
|
2024-04-25 07:35:16 +00:00
|
|
|
bootActor("dataspace") do (turn: var Turn):
|
2024-04-24 14:15:13 +00:00
|
|
|
dict.setCap turn.newDataspace
|
|
|
|
runForObj dict
|
|
|
|
i.push dict
|
|
|
|
|
|
|
|
def.symbol("assert") do (i: In):
|
|
|
|
let vals = i.expect(dictCapType, "a")
|
|
|
|
var
|
|
|
|
cap = vals[0].getCap
|
|
|
|
pr = i.toPreserves vals[1]
|
|
|
|
h = newVal 0
|
|
|
|
cap.relay.queueTurn do (turn: var Turn):
|
|
|
|
h.intVal = publish(turn, cap, pr)
|
|
|
|
while h.intVal == 0:
|
|
|
|
syndicate.runOnce()
|
|
|
|
i.push h
|
|
|
|
|
|
|
|
def.symbol("retract") do (i: In):
|
|
|
|
let
|
|
|
|
vals = i.expect(dictCapType, "int")
|
|
|
|
cap = vals[0].getCap
|
|
|
|
h = Handle vals[1].intVal
|
|
|
|
cap.relay.queueTurn do (turn: var Turn):
|
|
|
|
retract(turn, h)
|
|
|
|
|
|
|
|
def.symbol("message") do (i: In):
|
|
|
|
let vals = i.expect(dictCapType, "a")
|
|
|
|
var
|
|
|
|
cap = vals[0].getCap
|
|
|
|
pr = i.toPreserves vals[1]
|
|
|
|
cap.relay.queueTurn do (turn: var Turn):
|
|
|
|
message(turn, cap, pr)
|
|
|
|
|
|
|
|
def.symbol("sync") do (i: In):
|
|
|
|
let
|
|
|
|
vals = i.expect(dictCapType)
|
|
|
|
cap = vals[0].getCap
|
|
|
|
var pending = true
|
|
|
|
cap.relay.queueTurn do (turn: var Turn):
|
|
|
|
sync(turn, cap) do (turn: var Turn):
|
|
|
|
pending = false
|
|
|
|
while pending:
|
|
|
|
if not syndicate.runOnce():
|
|
|
|
raiseInvalid("failed to make sync progress")
|
|
|
|
|
|
|
|
def.finalize("syndicate")
|