| Name | Status | Features | Purpose |
|---|---|---|---|
| Core Proposal | Stage 0 | Infix pipelines … |> …Lexical topic # |
Unary function/expression application |
| Additional Feature BC | None | Bare constructor calls … |> new … |
Tacit application of constructors |
| Additional Feature BA | None | Bare awaited calls … |> await … |
Tacit application of async functions |
| Additional Feature BP | None | Block pipeline steps … |> {…} |
Application of statement blocks |
| Additional Feature PF | None | Pipeline functions +> |
Partial function/expression application Function/expression composition Method extraction |
| Additional Feature TS | None | Pipeline try statements |
Tacit application to caught errors |
| Additional Feature NP | None | N-ary pipelines (…, …) |> …Lexical topics ##, ###, and ... |
N-ary function/expression application |
ECMAScript No-Stage Proposal. Living Document. J. S. Choi, 2018-12.
This document is not yet intended to be officially proposed to TC39 yet; it merely shows a possible extension of the Core Proposal in the event that the Core Proposal is accepted.
An additional feature – bare awaited calls – would make async function calls terser. It adds
another mode to bare style: if a bare-style pipeline step is preceded by a
await, then instead of a mere function call, it is an awaited function call.
value |> await object.asyncFunction is equivalent to await object.asyncFunction(value). This would be backwards compatible with the Core
Proposal as well as all other additional features.
Additional Feature BA is formally specified in in the draft specification.
| With smart pipelines | Status quo |
|---|---|
value
|> # + '!'
|> new User.Message(#)
|> await stream.write
|> console.log; |
console.log(
await stream.write(
new User.Message(
value + '!'
)
)
); |
If a pipeline step starts with await, followed by a mere identifier, optionally with
a chain of properties, and with no parentheses or brackets, then that identifier
is interpreted to be a bare awaited function call.
That is: if a pipeline is of the form
topic |> await identifier
or topic |> await identifier0.identifier1
or topic |> await identifier0.identifier1.identifier2
or so forth,
then the pipeline is a bare async function call.
| Valid topic style | Valid bare style | Invalid pipeline |
|---|---|---|
… |> await af(#) |
… |> await af |
… |> await af() 🚫 |
| ″″ | ″″ | … |> (await f) 🚫 |
| ″″ | ″″ | … |> (await f()) 🚫 |
| ″″ | ″″ | … |> await (f) 🚫 |
| ″″ | ″″ | … |> await (f()) 🚫 |
… |> af |> await # |
″″ | … |> af |> await 🚫 |
… |> await o.f(#) |
… |> await o.f |
… |> await o.f() 🚫 |
… |> await o.make()(#) |
const af = o.make(); … |> await af |
… |> await o.make() 🚫 |
… |> await new o.make()(#) |
const af = new o.make(); … |> await af |
… |> new await o.make() 🚫 |