We need to encapsulate a relationship between an operation and its
initiator, so that, in a typical scenario, the initiator may create
and submit the operation in a non-blocking way, yet being confident
that it will be carried out. The operation will eventually trigger its
initiator back in an appropriate manner, to notify it of results, or
of progress, as defined in their protocol.
This relationship is typed, as a couple of examples will show:
The initiator of an operation consisting of configuring a node in
a transmission network actually registers two callbacks (to the
operation, not to the scheduler): one for success, one for failure.
The operation will know which one to trigger at the time of its
completion.
The initiator of a low-level input operation for a text processor
may register only one callback for character input. This implies that
the initiator has some separate means to detect the end of input, to
which it reacts by deleting the pending input operation.
The existence of such a two-way relationship allows to chain
operations and thus to compose them either sequentially or in
parallel.