Expose bindings values in during, onPublish, and onMessage
This commit is contained in:
parent
9c5e26e8f1
commit
ba2ea5d08b
|
@ -20,7 +20,7 @@ export patterns
|
||||||
export Actor, Assertion, Facet, Handle, Cap, Ref, Symbol, Turn, TurnAction,
|
export Actor, Assertion, Facet, Handle, Cap, Ref, Symbol, Turn, TurnAction,
|
||||||
`$`, addCallback, analyse, asyncCheck, bootDataspace,
|
`$`, addCallback, analyse, asyncCheck, bootDataspace,
|
||||||
facet, future, inFacet, message, newDataspace, onStop, publish,
|
facet, future, inFacet, message, newDataspace, onStop, publish,
|
||||||
retract, replace, run, spawn, stop, unembed, unpackLiterals
|
retract, replace, run, spawn, stop, stopActor, unembed, unpackLiterals
|
||||||
|
|
||||||
proc `!`*(typ: static typedesc): Pattern {.inline.} =
|
proc `!`*(typ: static typedesc): Pattern {.inline.} =
|
||||||
patterns.dropType(typ)
|
patterns.dropType(typ)
|
||||||
|
@ -99,8 +99,9 @@ proc wrapPublishHandler(turn, handler: NimNode): NimNode =
|
||||||
generateHandlerNodes(handler)
|
generateHandlerNodes(handler)
|
||||||
handleSym = ident"handle"
|
handleSym = ident"handle"
|
||||||
handlerSym = genSym(nskProc, "publish")
|
handlerSym = genSym(nskProc, "publish")
|
||||||
|
bindingsSym = ident"bindings"
|
||||||
quote do:
|
quote do:
|
||||||
proc `handlerSym`(`turn`: var Turn; bindings: Assertion; `handleSym`: Handle) =
|
proc `handlerSym`(`turn`: var Turn; `bindingsSym`: Assertion; `handleSym`: Handle) =
|
||||||
`varSection`
|
`varSection`
|
||||||
if fromPreserve(`valuesSym`, bindings):
|
if fromPreserve(`valuesSym`, bindings):
|
||||||
`publishBody`
|
`publishBody`
|
||||||
|
@ -110,8 +111,9 @@ proc wrapMessageHandler(turn, handler: NimNode): NimNode =
|
||||||
(valuesSym, varSection, body) =
|
(valuesSym, varSection, body) =
|
||||||
generateHandlerNodes(handler)
|
generateHandlerNodes(handler)
|
||||||
handlerSym = genSym(nskProc, "message")
|
handlerSym = genSym(nskProc, "message")
|
||||||
|
bindingsSym = ident"bindings"
|
||||||
quote do:
|
quote do:
|
||||||
proc `handlerSym`(`turn`: var Turn; bindings: Assertion) =
|
proc `handlerSym`(`turn`: var Turn; `bindingsSym`: Assertion) =
|
||||||
`varSection`
|
`varSection`
|
||||||
if fromPreserve(`valuesSym`, bindings):
|
if fromPreserve(`valuesSym`, bindings):
|
||||||
`body`
|
`body`
|
||||||
|
@ -146,7 +148,7 @@ macro onPublish*(turn: untyped; ds: Cap; pattern: Pattern; handler: untyped) =
|
||||||
handlerProc = wrapPublishHandler(turn, handler)
|
handlerProc = wrapPublishHandler(turn, handler)
|
||||||
handlerSym = handlerProc[0]
|
handlerSym = handlerProc[0]
|
||||||
result = quote do:
|
result = quote do:
|
||||||
if `pattern`.analyse.capturePaths.len != `argCount`:
|
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
|
||||||
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
||||||
`handlerProc`
|
`handlerProc`
|
||||||
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(publishImpl: `handlerSym`))
|
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(publishImpl: `handlerSym`))
|
||||||
|
@ -158,7 +160,7 @@ macro onMessage*(turn: untyped; ds: Cap; pattern: Pattern; handler: untyped) =
|
||||||
handlerProc = wrapMessageHandler(turn, handler)
|
handlerProc = wrapMessageHandler(turn, handler)
|
||||||
handlerSym = handlerProc[0]
|
handlerSym = handlerProc[0]
|
||||||
result = quote do:
|
result = quote do:
|
||||||
if `pattern`.analyse.capturePaths.len != `argCount`:
|
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
|
||||||
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
||||||
`handlerProc`
|
`handlerProc`
|
||||||
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`))
|
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`))
|
||||||
|
@ -176,7 +178,7 @@ macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody, retractBody
|
||||||
callbackProc = wrapDuringHandler(turn, publishBody, retractBody)
|
callbackProc = wrapDuringHandler(turn, publishBody, retractBody)
|
||||||
callbackSym = callbackProc[0]
|
callbackSym = callbackProc[0]
|
||||||
result = quote do:
|
result = quote do:
|
||||||
if `pattern`.analyse.capturePaths.len != `argCount`:
|
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
|
||||||
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
||||||
`callbackProc`
|
`callbackProc`
|
||||||
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))
|
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))
|
||||||
|
@ -184,11 +186,11 @@ macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody, retractBody
|
||||||
macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody: untyped) =
|
macro during*(turn: untyped; ds: Cap; pattern: Pattern; publishBody: untyped) =
|
||||||
## Variant of `during` without a retract body.
|
## Variant of `during` without a retract body.
|
||||||
let
|
let
|
||||||
argCount = argumentCount(publishBody)
|
`argCount` = argumentCount(publishBody)
|
||||||
callbackProc = wrapDuringHandler(turn, publishBody, nil)
|
callbackProc = wrapDuringHandler(turn, publishBody, nil)
|
||||||
callbackSym = callbackProc[0]
|
callbackSym = callbackProc[0]
|
||||||
result = quote do:
|
result = quote do:
|
||||||
if `pattern`.analyse.capturePaths.len != `argCount`:
|
if `argCount` != 0 and `pattern`.analyse.capturePaths.len != `argCount`:
|
||||||
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
raiseAssert($`pattern`.analyse.capturePaths.len & " values captured but handler has " & $`argCount` & " arguments")
|
||||||
`callbackProc`
|
`callbackProc`
|
||||||
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))
|
discard observe(`turn`, `ds`, `pattern`, during(`callbackSym`))
|
||||||
|
|
|
@ -75,7 +75,7 @@ type
|
||||||
Turn* = object # an object that should remain on the stack
|
Turn* = object # an object that should remain on the stack
|
||||||
facet: Facet
|
facet: Facet
|
||||||
queues: Queues # a ref object that can outlive Turn
|
queues: Queues # a ref object that can outlive Turn
|
||||||
when defined(traceSyndicate):
|
when tracing:
|
||||||
desc: TurnDescription[void]
|
desc: TurnDescription[void]
|
||||||
|
|
||||||
Facet* = ref FacetObj
|
Facet* = ref FacetObj
|
||||||
|
@ -587,7 +587,7 @@ proc onStop*(facet: Facet; act: TurnAction) =
|
||||||
|
|
||||||
proc stopActor*(turn: var Turn) =
|
proc stopActor*(turn: var Turn) =
|
||||||
let actor = turn.facet.actor
|
let actor = turn.facet.actor
|
||||||
enqueue(turn, turn.facet.actor.root) do (turn: var Turn):
|
enqueue(turn, actor.root) do (turn: var Turn):
|
||||||
terminate(actor, turn, nil)
|
terminate(actor, turn, nil)
|
||||||
|
|
||||||
proc freshen*(turn: var Turn, act: TurnAction) =
|
proc freshen*(turn: var Turn, act: TurnAction) =
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "20230726"
|
version = "20230801"
|
||||||
author = "Emery Hemingway"
|
author = "Emery Hemingway"
|
||||||
description = "Syndicated actors for conversational concurrency"
|
description = "Syndicated actors for conversational concurrency"
|
||||||
license = "Unlicense"
|
license = "Unlicense"
|
||||||
|
|
Loading…
Reference in New Issue