Taking a fact from an agent, arvo or whatever is easy. First you subscribe using
watch-our:strandio, then you use
take-fact:strandio to receive the fact. Here's an example that takes an update from
graph-store and prints the message to the dojo:
/- spider/+ *strandio, *graph-store=, strand=strand:spider=>|%++ take-update=/ m (strand ,~)^- form:m;< =cage bind:m (take-fact /graph-store)=/ =update !< update q.cage?. ?=(%add-nodes -.q.update)(pure:m ~)=/ nodes=(list [=index =node]) ~(tap by nodes.q.update)?~ nodes(pure:m ~)=/ contents=(list content) contents.post.node.i.nodes?~ contents(pure:m ~)?. ?=(%text -.i.contents)(pure:m ~)=/ msg (trip text.i.contents)%- (slog leaf+msg ~)(pure:m ~)--^- thread:spider|= arg=vase=/ m (strand ,vase)^- form:m;< ~ bind:m (watch-our /graph-store %graph-store /updates);< ~ bind:m take-update(pure:m !>(~))
Create a chat on your fake zod if you don't have one already, then save the thread in
/ted on the
|commit %base, and run
-print-msg. Next, type some message in your chat and you'll see it printed in the dojo.
First we call
watch-our to subscribe:
;< ~ bind:m (watch-our /graph-store %graph-store /updates)
We've spun the next part out into its own core, but it's just a
take-fact to receive the update:
;< =cage bind:m (take-fact /graph-store)
The rest of the code is just to pull the message out of the complicate data structure returned by graph-store and isn't important.
Spider will automatically leave the subscription once the thread finishes.
take-fact only takes a single fact, so you'd need one for each message you're expecting. Alternatively you can use
main-loop to take an arbitrary number of facts.