Equivalence check.
See Node.opIndex.
Semantic hash. Depends on the number of continuations instantiated by this node.
Provides an iterator over this node's in-edges.
Provides an iterator over this node's out-edges.
Frees all resources allocated by this node and sets it to an uninitialized state.
Initializes an instantiation node, must be later disposed.
Non-empty collection of live continuations, each corresponding to a channel in the join pattern.
Points to the definition of the join node being instantiated.
Post-move adjusts in-edge slots' owner pointer.
TODO: continuation semantics are unclear w.r.t. multiple uses and scope. e.g.: can a continuation be used more than once (with basic blocks, we would like the answer to be a YES, with return continuations, a NO), or are they consumed when the join triggers? what happens if a continuation is instantiated and never jumped to? what if two threads race to use the same continuation? yet another case is with upwards-escaping continuations, which we want to forbid (so that a function can't return a continuation back into itself)
Instantiates a join node.
Join nodes correspond to static ("dead") subprograms. In order to actually use a join pattern, one must first create a "live" instance of it. The result of such an instantiation is a non-empty collection of continuations, one for each channel in the join pattern. Then, using a continuation requires one to provide its parameters and jump into it, which may trigger the join node's body.