Oh apologies for not taking a few moments to use the search facility. The 
linked github sounds extremely promising and certainly captures far more use 
cases than I initially intended.

Thanks Logan.

David


> On 11 Jul 2017, at 21:10, Logan Smyth <[email protected]> wrote:
> 
> There's been talk of this before here and in 
> https://github.com/gilbert/es-pipeline-operator 
> <https://github.com/gilbert/es-pipeline-operator> among other places. Most 
> recently this was posted, which sounds like promising progress: 
> https://github.com/gilbert/es-pipeline-operator/issues/33#issuecomment-306986211
>  
> <https://github.com/gilbert/es-pipeline-operator/issues/33#issuecomment-306986211>
> 
> On Tue, Jul 11, 2017 at 1:02 PM, David White <[email protected] 
> <mailto:[email protected]>> wrote:
> Piping is useful when composing many small pure functions together, one 
> problem with this is the evaluation needs to be read from the inner most 
> expression value in reverse to the outer most function call. Given the 
> following statement we can see that it would be read as 'call math round then 
> call math square then pass in PI', whereas the order of execution is in 
> reverse.
> 
> ```javascript
> const myNumber = Math.round(Math.sqrt(Math.PI));
> ```
> 
> Unix has long provided a piping mechanism to achieve that, for example: `ps 
> aux | grep node`, as well as F# and the Elixir programming language, both 
> provide the `|>` pipe greater-than operator which is very readable.
> 
> My proposal would be to use the slightly more verbose `|>` pipe-greater than 
> syntax, it provides a convenient direction of travel for the expression on 
> the left side, into the expression on the right, F# also provides a `<|`, 
> which pipes in the opposite direction though I’ve not really seen very good 
> use cases for this operator.
> 
> ```javascript
> const myNumber = Math.PI |> Math.sqrt |> Math.round;
> ```
> 
> The left side of the operator should always be a primitive data type or data 
> structure, these could be any of the following: `Boolean`, `Null`, 
> `undefined`, `Number`, `String`, `Symbol` or `Object`. Since functions are 
> standard objects they can be passed in as the initial value, as long as the 
> function on the right handles the calling on that function.
> 
> It also provides a way to either log, process, or do anything with the data 
> from the last expression on the left at various stages of the execution 
> without adding additional brackets in and around the calls, for example.
> 
> ```javascript
> function logger (callback) {
>   return function (value) {
>     callback(value);
>     return value;
>   };
> }
> 
> Math.PI
>   |> logger(console.log);
>   |> Math.sqrt
>   |> logger(console.log);
>   |> Math.round
>   |> logger(console.log);
> ```
> 
> While a slightly contrived example as we certainly wouldn't write code that 
> looks like:
> 
> ```javascript
> logger(Math.round(logger(Math.sqrt(logger(Math.PI)))));
> ```
> 
> We would instead assign to variables at each stage of execution:
> 
> ```javascript
> const PI = Math.PI;
> logger(PI);
> 
> const squaredPI = Math.sqrt(PI);
> logger(squaredPI);
> 
> const roundedSquaredPI = Math.round(squaredPI);
> logger(roundedSquaredPI);
> ```
> 
> However with this clarity we have unfortunately had to create additional 
> constants within this lexical block, whereas simple value passing between 
> pure functions provides a very clean and readable approach and allows easier 
> updates in the future if we wanted to add additional processing within the 
> chain, for example Express middleware composition.
> 
> Would love to hear some thoughts on this?
> 
> David
> 
> * [F# pipe 
> operator](https://docs.microsoft.com/en-gb/dotnet/fsharp/language-reference/functions/index#function-composition-and-pipelining
>  
> <https://docs.microsoft.com/en-gb/dotnet/fsharp/language-reference/functions/index#function-composition-and-pipelining>)
> * [Elixir pipe 
> operator](https://elixir-lang.org/getting-started/enumerables-and-streams.html#the-pipe-operator
>  
> <https://elixir-lang.org/getting-started/enumerables-and-streams.html#the-pipe-operator>)
> * [Unix pipeline](https://en.wikipedia.org/wiki/Pipeline_(Unix) 
> <https://en.wikipedia.org/wiki/Pipeline_(Unix)>)
> 
> _______________________________________________
> es-discuss mailing list
> [email protected] <mailto:[email protected]>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 

_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to