Summary
That's basically all you need to know to write threads. The best way to get a good handle on them is just to experiment with some strandio
functions. For information on running threads from gall agents, see here and for some examples see here.
Now here's a quick recap of the main points covered:
Spider
is the Gall agent that manages threads.
Details of interacting with threads via Spider can be seen here.
Threads
are like transient Gall agents
are used mostly to chain a series of IO operations
can be used by Gall agents to spin out IO operations
live in the
/ted
directory or, in the case of inline threads, inside a Gall agentare managed by the Gall agent
spider
, but run via the Khan vanetake a
$vase
(unless they're an inline thread) and produce a+strand
which produces a$vase
Example
|= arg=vase
=/ m (strand:rand ,vase)
^- form:m
(pure:m arg)
Strands
are the building blocks of threads
take
$strand-input:rand
and produce$output:strand:rand
.must be specialised to produce a particular type like
(strand:rand ,@ud)
.are conventionally given the face
m
.are a core that has three main arms -
+form
,+pure
and+bind
:
form
is the mold of the strand suitable for casting
is the type returned by the other arms
pure
simply returns the
+form
of a strand that produces pure's argument without doing any IO
bind
is used to chain strands together like javascript promises
is used in conjunction with micgal (
;<
)must be specialised to a type like
;< <type> bind:m ...
takes two arguments. The first is a function that returns the
+form
of a strand that produces<type>
. The second is a gate whose sample is<type>
and which returns a+form
.calls the first and then, if it succeeded, calls the second with the result of the first as its sample.
Strand input
looks like
[=bowl in=(unit input)]
bowl
has things likeour
,now
,eny
and so forthbowl
is populated once when the thread is first called and then every time it receives new inputinput
contains any incoming pokes, signs and watches.
Strand output
contains
[cards=(list card:agent:gall) <response>]
cards
are any cards to be sent immediately<response>
is something like[%done value]
,[%fail err]
, etc.%done
will contain the resultresponses are only used internally to manage the flow of the thread and are not returned to subscribers.
Strandio
is located in
/lib/strandio/hoon
contains a collection of ready-made functions for use in threads
eg.
+sleep
,+get-bowl
,+take-watch
,+poke
,+fetch-json
, etc.
Last updated