have you ever tried making a cps function that takes a closure as an argument?
This commit is contained in:
parent
da93f9eb1f
commit
fe268dea8d
|
@ -196,29 +196,21 @@ macro during*(ds: Cap; pattern: Pattern; publishBody: untyped) =
|
||||||
discard observe(activeTurn(), `ds`, `pattern`, during(`callbackSym`))
|
discard observe(activeTurn(), `ds`, `pattern`, during(`callbackSym`))
|
||||||
]#
|
]#
|
||||||
|
|
||||||
type BootProc = proc (ds: Cap)
|
|
||||||
|
|
||||||
#[
|
|
||||||
proc runActor*(name: string; bootProc: BootProc) =
|
|
||||||
## Run an `Actor` to completion.
|
|
||||||
let actor = newActor(name)
|
|
||||||
let actor = bootDataspace(name, bootProc)
|
|
||||||
while actor.running:
|
|
||||||
ioqueue.run()
|
|
||||||
|
|
||||||
proc runActor*(name: string; bootProc: DeprecatedBootProc) {.deprecated.} =
|
|
||||||
## Run an `Actor` to completion.
|
|
||||||
runActor(name) do (turn: Turn, ds: Cap):
|
|
||||||
bootProc(ds, turn)
|
|
||||||
]#
|
|
||||||
|
|
||||||
proc wrapHandler(body: NimNode; ident: string): NimNode =
|
proc wrapHandler(body: NimNode; ident: string): NimNode =
|
||||||
var sym = genSym(nskProc, ident)
|
var sym = genSym(nskProc, ident)
|
||||||
quote do:
|
quote do:
|
||||||
proc `sym`(cont: Cont): Cont {.cpsMagic.} =
|
proc `sym`() =
|
||||||
`body`
|
`body`
|
||||||
nil
|
|
||||||
|
|
||||||
|
macro onStop*(body: untyped) =
|
||||||
|
let
|
||||||
|
handlerDef = wrapHandler(body, "onStop")
|
||||||
|
handlerSym = handlerDef[0]
|
||||||
|
result = quote do:
|
||||||
|
`handlerDef`
|
||||||
|
addOnStopHandler(`handlerSym`)
|
||||||
|
|
||||||
|
#[
|
||||||
macro onStop*(body: untyped) =
|
macro onStop*(body: untyped) =
|
||||||
quote do:
|
quote do:
|
||||||
block:
|
block:
|
||||||
|
@ -227,3 +219,4 @@ macro onStop*(body: untyped) =
|
||||||
if facet.stopped():
|
if facet.stopped():
|
||||||
`body`
|
`body`
|
||||||
return
|
return
|
||||||
|
]#
|
||||||
|
|
|
@ -28,12 +28,15 @@ type
|
||||||
|
|
||||||
FacetState = enum fFresh, fRunning, fEnded
|
FacetState = enum fFresh, fRunning, fEnded
|
||||||
|
|
||||||
|
Callback* = proc () {.nimcall.}
|
||||||
|
|
||||||
Facet* = ref object
|
Facet* = ref object
|
||||||
## https://synit.org/book/glossary.html#facet
|
## https://synit.org/book/glossary.html#facet
|
||||||
actor: Actor
|
actor: Actor
|
||||||
parent: Facet
|
parent: Facet
|
||||||
children: seq[Facet]
|
children: seq[Facet]
|
||||||
stopHandlers: HandlerDeque
|
stopHandlers: HandlerDeque
|
||||||
|
stopCallbacks: seq[Callback]
|
||||||
state: FacetState
|
state: FacetState
|
||||||
when traceSyndicate:
|
when traceSyndicate:
|
||||||
id: FacetId
|
id: FacetId
|
||||||
|
@ -221,6 +224,9 @@ proc stop(turn; facet; reason: FacetStopReason) =
|
||||||
var c = whelp runNextFacetStop()
|
var c = whelp runNextFacetStop()
|
||||||
c.facet = facet
|
c.facet = facet
|
||||||
complete(turn, c)
|
complete(turn, c)
|
||||||
|
while facet.stopCallbacks.len > 0:
|
||||||
|
var cb = facet.stopCallbacks.pop()
|
||||||
|
cb()
|
||||||
while facet.children.len > 0:
|
while facet.children.len > 0:
|
||||||
stop(turn, facet.children.pop(), FacetStopReason.parentStopping)
|
stop(turn, facet.children.pop(), FacetStopReason.parentStopping)
|
||||||
when traceSyndicate:
|
when traceSyndicate:
|
||||||
|
@ -335,3 +341,7 @@ proc sync*(cap: Cap) {.syndicate.} =
|
||||||
proc installStopHook*(c: Cont, facet: Facet): Cont {.cpsMagic.} =
|
proc installStopHook*(c: Cont, facet: Facet): Cont {.cpsMagic.} =
|
||||||
facet.stopHandlers.add(c.fn)
|
facet.stopHandlers.add(c.fn)
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
proc addOnStopHandler*(c: Cont; cb: Callback): Cont {.cpsMagic.} =
|
||||||
|
c.facet.stopCallbacks.add(cb)
|
||||||
|
result = c
|
||||||
|
|
Loading…
Reference in New Issue