From 13c8dce517b34207bea3ddec87488457d4e4019e Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Tue, 6 Apr 2021 14:27:48 +0300 Subject: [PATCH] docs... Signed-off-by: Alex A. Naanou --- README.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ab2f96..b97db68 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,9 @@ A library of JavaScript type extensions, types and type utilities. - [`RegExp`](#regexp) - [`RegExp.quoteRegExp(..)`](#regexpquoteregexp) - [`Promise`](#promise) + - [Interactive promises](#interactive-promises) + - [`Promise.interactive(..)`](#promiseinteractive) + - [`.send(..)`](#promise-intersend) - [Cooperative promises](#cooperative-promises) - [`Promise.cooperative(..)`](#promisecooperative) - [`.set(..)`](#promise-coopset) @@ -1143,9 +1146,84 @@ var promise = require('ig-types/Promise') ``` +### Interactive promises + +_Interactive promises_ can be sent messages and then handle them. + + +```javascript +var printer = Promise.interactive(function(resolve, reject, onmessage){ + var buf = [] + var state = 'pending' + onmessage(function(type, ...args){ + type == 'flush' ? + (buf = buf + .filter(function([type, state, ...args]){ + console[type](`(${ state }):`, ...args) })) + : type == 'close' ? + (resolve(...args), + state = 'resolved') + : buf.push([type, state, ...args]) }) }) + +printer + .send('log', 'some message...') + .send('warn', 'some warning...') + .send('flush') + .send('close') +``` + +Note that message handling is independent of promise state, so in the above case +we can still _flush_ the buffer even if the promise is resolved +```javascript +printer + .send('log', 'some other message...') + .send('flush') +``` + +If the user wants to reject messages after the promise is finalized it is their +responsibility. + + +#### `Promise.interactive(..)` + +Create and interactive promise +```bnf +Promise.interactive() + -> +``` + +The `` accepts one additional argument, compared to the `Promise(..)` +handler, ``, used to register message handlers. +```bnf +(, , ) + +() +``` + +`` is called when a message is sent via +[`.send()`](#promise-intersend). + + +#### `.send(..)` + +Send a message to an interactive promise +```bnf +.send() +.send(...) + -> +``` + +Sending a message triggers message handlers registered via `(..)` +passing each handler the sent arguments. + + + ### Cooperative promises - +A _cooperative promise_ is one the state of which can be controlled +externally/cooperatively. + + #### `Promise.cooperative(..)`