From 515ef2280582eb83c947ad0329cada3c2819d291 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 2 Nov 2021 13:02:20 +0100 Subject: [PATCH] Add onRetract sugar to scope of onPublish --- src/syndicate.nim | 13 +++++++++---- tests/chat.nim | 20 ++++++-------------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/syndicate.nim b/src/syndicate.nim index f459a24..adf7417 100644 --- a/src/syndicate.nim +++ b/src/syndicate.nim @@ -3,7 +3,7 @@ import std/macros import preserves -import syndicate/[actors, patterns] +import syndicate/[actors, dataspaces, patterns] export patterns proc wrapPublishHandler(handler: NimNode): NimNode = @@ -30,15 +30,20 @@ proc wrapPublishHandler(handler: NimNode): NimNode = var varSectionOuter = newNimNode(nnkVarSection, handler).add( newIdentDefs(valuesSym, valuesTuple)) - body = newStmtList(varSectionInner, handler[6]) + publishBody = newStmtList(varSectionInner, handler[6]) turnSym = ident"turn" handleSym = ident"handle" handlerSym = genSym(nskProc, "publish") + onRetractIdent = ident"onRetract" quote do: - proc `handlerSym`(_: Entity; `turnSym`: var Turn; bindings: Assertion; `handleSym`: Handle) = + proc `handlerSym`(entity: Entity; `turnSym`: var Turn; bindings: Assertion; `handleSym`: Handle) = `varSectionOuter` if fromPreserve(`valuesSym`, bindings): - `body` + template `onRetractIdent`(retractBody: untyped): untyped = + proc callback(e: Entity; turn: var Turn; h: Handle) = + retractBody + entity.retractImpl = callback # TODO: fine to clobber previous callback? + `publishBody` proc wrapMessageHandler(handler: NimNode): NimNode = handler.expectKind nnkDo diff --git a/tests/chat.nim b/tests/chat.nim index 68563e7..238a4a1 100644 --- a/tests/chat.nim +++ b/tests/chat.nim @@ -10,17 +10,9 @@ from syndicate/protocols/protocol import Handle from os import getCurrentProcessId -when defined(linux): - proc getentropy(buf: pointer; bufLen: csize_t): cint {. - importc, header: "sys/random.h".} - proc mint(): SturdyRef = - - #var key: array[32, byte] - #doAssert getEntropy(addr key[0], csize_t key.len) == 0 - #mint(key, "syndicate") - let pr = parsePreserves("""""", Ref) - doAssert fromPreserve(result, pr) + var key: array[16, byte] + mint(key, "syndicate") waitFor runActor("chat") do (turn: var Turn): @@ -40,12 +32,12 @@ waitFor runActor("chat") do (turn: var Turn): updateUsername(turn, "user" & $getCurrentProcessId()) - onPublish(turn, ds, Present ? {0: `?`()}) do (username: string): + onPublish(turn, ds, Present ? {0: `?*`()}) do (username: string): echo username, " arrived" - #onRetract: - # echo username, " left" + onRetract: + echo username, " left" - onMessage(turn, ds, Says ? {0: `?`(), 1: `?`()}) do (who: string; what: string): + onMessage(turn, ds, Says ? {0: `?*`(), 1: `?*`()}) do (who: string; what: string): echo who, ": ", what message(turn, ds, Says(who: username, what: "hello"))