<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ken Okabe</title>
    <description>The latest articles on DEV Community by Ken Okabe (@kentechgeek).</description>
    <link>https://dev.to/kentechgeek</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F456907%2F2086b6ef-764b-416d-bec5-8fee75e2eb06.png</url>
      <title>DEV Community: Ken Okabe</title>
      <link>https://dev.to/kentechgeek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kentechgeek"/>
    <language>en</language>
    <item>
      <title>All-in-One GitHub Repository-Driven Dev.to Article Management System</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Thu, 08 May 2025 04:01:35 +0000</pubDate>
      <link>https://dev.to/kentechgeek/all-in-one-github-repository-driven-devto-article-management-system-2031</link>
      <guid>https://dev.to/kentechgeek/all-in-one-github-repository-driven-devto-article-management-system-2031</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/ken-okabe/devto-article-cli-private" rel="noopener noreferrer"&gt;https://github.com/ken-okabe/devto-article-cli-private&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  All-in-One GitHub Repository-Driven Dev.to Article Management System
&lt;/h1&gt;

&lt;p&gt;Welcome to &lt;code&gt;devto-article-cli&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;This repository is designed to be your &lt;strong&gt;central hub for managing Dev.to articles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It not only contains the Node.js command-line tool itself but also serves as the primary storage and version control system for your article content (typically within the &lt;code&gt;articles/&lt;/code&gt; directory). The included CLI scripts empower you to seamlessly create, edit (in Markdown), version with Git, and publish your Dev.to articles directly from this integrated, local-first environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnote.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnote.svg" width="100" height="25"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This README is also intended to be interpretable by AI agents (e.g., GitHub Copilot, VSCode AI assistants) to facilitate their use of this tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnotefooter.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnotefooter.svg" width="100" height="15"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Write articles locally and use Git for version control.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publish new articles and update existing ones on Dev.to with simple commands.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically appends Dev.to article ID to Markdown files upon publishing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatic Image Handling&lt;/strong&gt;: Converts local relative image paths in your Markdown to absolute GitHub URLs when publishing to Dev.to, while keeping your local files unchanged for easy previewing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check consistency between local articles and Dev.to.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No CI needed; everything is handled in your local environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fully automates &lt;code&gt;git add&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and &lt;code&gt;git push&lt;/code&gt; for the publishing workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compliant with the latest &lt;a href="https://developers.forem.com/api" rel="noopener noreferrer"&gt;Forem API V1 (1.0.0)&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites (For Users and AI Agents)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Node.js (LTS recommended)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dev.to account and API Key&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup (For Users and AI Agents)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork this Repository (Recommended for Users):&lt;/p&gt;

&lt;p&gt;If you intend to use this tool to manage your articles, first fork the devto-article-cli repository to your own GitHub account. This creates your personal copy where your articles will be stored.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clone Your Forked Repository&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/YOUR_USERNAME/devto-article-cli.git
cd devto-article-cli
# Replace YOUR_USERNAME with your GitHub username.
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Dependencies:&lt;/p&gt;

&lt;p&gt;Navigate to the cloned/created directory and install the necessary Node.js packages:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build TypeScript: &lt;/p&gt;

&lt;p&gt;This process will generate &lt;code&gt;dist&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set Dev.to API Key:&lt;/p&gt;

&lt;p&gt;Obtain your API key from your Dev.to Settings &amp;gt; Extensions page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqhpgh7h2revrt3xrejt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqhpgh7h2revrt3xrejt.png" alt="image" width="381" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd9c6m4fl5pxwy0zbcgh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgd9c6m4fl5pxwy0zbcgh.png" alt="image" width="716" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set it as an OS environment variable named &lt;code&gt;DEV_TO_API_KEY&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   **Windows (Command Prompt/PowerShell)**:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```
    # Command Prompt
    setx DEV_TO_API_KEY "your_api_key"
    # PowerShell
    [System.Environment]::SetEnvironmentVariable('DEV_TO_API_KEY', 'your_api_key', 'User')
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Restart your terminal after setting.

-   macOS (if using zsh):

    Add to ~/.zshrc:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```
    echo 'export DEV_TO_API_KEY="your_api_key"' &amp;gt;&amp;gt; ~/.zshrc &amp;amp;&amp;amp; source ~/.zshrc
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   Linux (if using bash):

    Add to ~/.bashrc:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ```
    echo 'export DEV_TO_API_KEY="your_api_key"' &amp;gt;&amp;gt; ~/.bashrc &amp;amp;&amp;amp; source ~/.bashrc
    ```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If this environment variable is not set when the script runs, a message prompting you to set it will be displayed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Initial Git Configuration (Important!):&lt;/p&gt;

&lt;p&gt;Ensure your Git remote origin points to your forked repository on GitHub. If you cloned your fork, this should be set correctly. You may need to configure your Git user name and email if you haven't already:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ready to Go!:&lt;/p&gt;

&lt;p&gt;You are now set up. Use the commands below to manage your articles. Changes will be pushed to your forked repository.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Usage (For Users and AI Agents)
&lt;/h2&gt;

&lt;p&gt;This tool provides three core commands. AI agents should be instructed to use these commands as described.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a New Article (&lt;code&gt;article:new&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To create a new article boilerplate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run article:new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AI Agent Interaction&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Execute the command &lt;code&gt;npm run article:new&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script will prompt: "Enter the title of the article:". Provide the desired article title.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script will then prompt: "Enter the slug for the filename (e.g., my-awesome-post):". Provide a URL-friendly slug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A new Markdown file (e.g., &lt;code&gt;articles/YYYY-MM-DD-HH-mm-ss-slug.md&lt;/code&gt;) will be created. Its front-matter will include the title and &lt;code&gt;published: false&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The AI agent should then populate this file with the article content. &lt;strong&gt;For images&lt;/strong&gt;, save them within this repository (e.g., in &lt;code&gt;articles/images/&lt;/code&gt;) and use &lt;strong&gt;relative paths&lt;/strong&gt; in the Markdown (e.g., &lt;code&gt;![My Alt Text](https://raw.githubusercontent.com/ken-okabe/devto-article-cli-private/main/articles/images/cool-pic.png)&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Publishing/Updating Articles (&lt;code&gt;article:publish&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To publish new articles or update existing ones (from the &lt;code&gt;articles/&lt;/code&gt; directory) to Dev.to and sync with GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run article:publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AI Agent Interaction&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ensure the article content within the &lt;code&gt;.md&lt;/code&gt; files in the &lt;code&gt;articles/&lt;/code&gt; directory is complete and ready for publishing. Ensure any images used are committed to the repository and referenced using relative paths in the Markdown. Adjust the &lt;code&gt;published&lt;/code&gt; field in the front-matter to &lt;code&gt;true&lt;/code&gt; if the article should go live.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the command &lt;code&gt;npm run article:publish&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script will automatically:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   Scan all `.md` files in the `articles/` directory.

-   **Convert local relative image paths to absolute GitHub Raw URLs** temporarily for sending to Dev.to.

-   For new articles (no `dev_to_article_id`): Post to Dev.to and add the new ID to the local file's front-matter.

-   For existing articles (`dev_to_article_id` present): Update the article on Dev.to.

-   `git add` all processed and modified local files (including images if they were added/changed and the article file).

-   `git commit` these changes with a summary message.

-   `git push` the commit to the remote GitHub repository.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; No manual Git commands are needed from the AI agent for this step. Console logs will indicate success or failure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnote.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnote.svg" width="100" height="25"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When posting with images from a repository, the forked repository must be public because Dev.to cannot access images in private GitHub repositories.&lt;/p&gt;

&lt;p&gt;For text-only posts, the forked repository can be private as no such web links are generated. Alternatively, if images are hosted separately where Dev.to can access them, the forked repository can also remain private.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnotefooter.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fken-okabe%2Fweb-images%2Fmain%2Fnotefooter.svg" width="100" height="15"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Checking Consistency (&lt;code&gt;article:check&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;To check for discrepancies between local articles and those on Dev.to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run article:check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AI Agent Interaction&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Execute the command &lt;code&gt;npm run article:check&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script will report:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-   Local articles with IDs: Verifies their existence and title on Dev.to.

-   Local articles without IDs: Lists them as unpublished.

-   Dev.to articles: Checks if corresponding local files (by ID) exist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; The AI agent can parse the console output to understand the consistency status and inform the user or take further actions if discrepancies are critical. This command is read-only.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Front-matter (For AI Agents)
&lt;/h2&gt;

&lt;p&gt;At the beginning of your article Markdown files, include YAML front-matter like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
title: "My Awesome Article Title"
published: false # true to publish, false to send as draft to Dev.to. Default is false.
tags: ["javascript", "tutorial", "webdev"], Array of tags
series: "Intermediate JavaScript Series" # Optional
# Use absolute URLs for main_image and canonical_url if needed
main_image: "https://..." # Optional: URL to the main image
canonical_url: "https://..." # Optional: URL to the original source
description: "\"This article explains advanced JavaScript techniques.\" # Optional"
# dev_to_article_id: 12345 # Automatically added/updated on publish
---

## Article Body Starts Here
Write freely in Markdown...

Include images using relative paths to files within this repository:
![Alt text for my image](https://raw.githubusercontent.com/ken-okabe/devto-article-cli-private/main/articles/images/my-local-image.jpg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting (For AI Agents)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;API Key Error&lt;/strong&gt;: Ensure the &lt;code&gt;DEV_TO_API_KEY&lt;/code&gt; environment variable is correctly set.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git Error&lt;/strong&gt;: Ensure your Git authentication (SSH keys or HTTPS credentials) is correctly set up for pushing to your remote repository. Ensure you have committed initial files if it's a new repository and that the remote &lt;code&gt;origin&lt;/code&gt; is correctly configured.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image Not Found on Dev.to&lt;/strong&gt;: Ensure the image file exists in your repository at the path referenced in the Markdown, and that you have pushed the commit containing the image &lt;em&gt;before&lt;/em&gt; running &lt;code&gt;publish&lt;/code&gt;. The automatic URL conversion relies on the image being accessible via its GitHub Raw URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If other error messages appear, check their content.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devto</category>
      <category>cli</category>
      <category>node</category>
      <category>markdown</category>
    </item>
    <item>
      <title>my first article via devto-article-cli</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Wed, 07 May 2025 21:40:05 +0000</pubDate>
      <link>https://dev.to/kentechgeek/my-first-article-via-devto-article-cli-3bee</link>
      <guid>https://dev.to/kentechgeek/my-first-article-via-devto-article-cli-3bee</guid>
      <description>&lt;p&gt;test&lt;/p&gt;

&lt;p&gt;edit&lt;/p&gt;

&lt;p&gt;edit2&lt;/p&gt;

&lt;p&gt;edit3&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Future of AI-Driven API Integration and the Rise of MCP v2</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Wed, 07 May 2025 09:53:05 +0000</pubDate>
      <link>https://dev.to/kentechgeek/the-future-of-ai-driven-api-integration-and-the-rise-of-mcp-v2-ieg</link>
      <guid>https://dev.to/kentechgeek/the-future-of-ai-driven-api-integration-and-the-rise-of-mcp-v2-ieg</guid>
      <description>&lt;h1&gt;
  
  
  The Future of AI-Driven API Integration and the Rise of MCP
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The integration of AI with various APIs is rapidly transforming the landscape of automation, content creation, and digital workflows. As AI systems become more capable of understanding and utilizing public APIs, the potential for seamless, intelligent automation grows exponentially.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI and API Collaboration
&lt;/h2&gt;

&lt;p&gt;AI assistants can now read, interpret, and interact with API documentation, enabling them to design and implement workflows that automate complex tasks. For example, as demonstrated in this repository, an AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read API documentation (such as Forem/Dev.to)&lt;/li&gt;
&lt;li&gt;Generate scripts to automate publishing, editing, and managing content&lt;/li&gt;
&lt;li&gt;Adapt workflows to new requirements with minimal human intervention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This capability allows for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapid prototyping and deployment of automation&lt;/li&gt;
&lt;li&gt;Reduced manual effort and human error&lt;/li&gt;
&lt;li&gt;Greater flexibility and scalability in digital operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Rise of Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol (MCP) is an emerging standard that aims to unify how AI models interact with tools, APIs, and external systems. MCP provides a structured way for AI to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover available APIs and tools&lt;/li&gt;
&lt;li&gt;Understand their capabilities and constraints&lt;/li&gt;
&lt;li&gt;Safely and reliably invoke actions or retrieve data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With MCP, the boundaries between AI, APIs, and traditional software blur, enabling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More robust and secure automation&lt;/li&gt;
&lt;li&gt;Easier integration across platforms and services&lt;/li&gt;
&lt;li&gt;A foundation for future AI-native applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;As AI and protocols like MCP mature, we can expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even more autonomous, context-aware workflows&lt;/li&gt;
&lt;li&gt;AI-driven orchestration of multi-step, cross-platform processes&lt;/li&gt;
&lt;li&gt;New opportunities for developers and organizations to leverage AI as a first-class automation agent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The synergy between AI and APIs, accelerated by standards like MCP, is set to redefine how we build, automate, and scale digital solutions. Staying informed and experimenting with these technologies will be key to unlocking their full potential.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>mcp</category>
      <category>automation</category>
    </item>
    <item>
      <title>Automating Dev.to Article Publishing with GitHub Actions and Node.js: A Workflow Overview</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Wed, 07 May 2025 09:26:37 +0000</pubDate>
      <link>https://dev.to/kentechgeek/automating-devto-article-publishing-with-github-actions-and-nodejs-a-workflow-overview-df7</link>
      <guid>https://dev.to/kentechgeek/automating-devto-article-publishing-with-github-actions-and-nodejs-a-workflow-overview-df7</guid>
      <description>&lt;h1&gt;
  
  
  Automating Dev.to Article Publishing with GitHub Actions and Node.js: A Workflow Overview
&lt;/h1&gt;

&lt;p&gt;This document outlines a workflow for automating the publishing of Markdown articles to Dev.to using Node.js scripts and GitHub Actions. The actual implementation (such as scripts and configuration files) can be generated by AI or created by a developer, making this guide suitable for both human and AI readers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Forem and the Dev.to API as the Foundation
&lt;/h2&gt;

&lt;p&gt;This workflow is designed based on the fact that Dev.to is built on the Forem platform. Forem provides a public API (see: &lt;a href="https://developers.forem.com/api/v1" rel="noopener noreferrer"&gt;https://developers.forem.com/api/v1&lt;/a&gt;) that enables programmatic interaction with Dev.to, including publishing articles, retrieving user data, and more.&lt;/p&gt;

&lt;p&gt;For this workflow, the AI assistant (not the user) has read and understood the Forem API documentation. The automation process leverages the API's article publishing endpoints, allowing scripts to post Markdown content directly to Dev.to. This ensures the workflow is robust, up-to-date, and aligned with Dev.to's official capabilities.&lt;/p&gt;

&lt;p&gt;By utilizing the Forem API, this workflow can be adapted or extended to other Forem-based communities in the future, not just Dev.to.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Overview
&lt;/h2&gt;

&lt;p&gt;The goal is to enable automatic publishing of Markdown articles to Dev.to whenever new content is pushed to a GitHub repository. This is achieved by combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Node.js script (generated by AI or written by a developer) that reads Markdown files and posts them to the Dev.to API.&lt;/li&gt;
&lt;li&gt;A GitHub Actions workflow that triggers the script on repository updates.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Workflow Steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prepare Your Repository Structure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organize your articles in a dedicated directory (e.g., &lt;code&gt;articles/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Place your automation script (e.g., &lt;code&gt;publish-to-devto.js&lt;/code&gt;) at the project root.&lt;/li&gt;
&lt;li&gt;Set up a GitHub Actions workflow file in &lt;code&gt;.github/workflows/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generate the Node.js Script&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The AI assistant, in agreement with the user, determined that robust article management (including update/overwrite support) is essential for practical operation.&lt;/li&gt;
&lt;li&gt;The AI implemented a solution where:

&lt;ul&gt;
&lt;li&gt;Each article file is associated with a unique Dev.to article ID, managed in a metadata file.&lt;/li&gt;
&lt;li&gt;On new article creation, the script saves the returned Dev.to ID for future updates.&lt;/li&gt;
&lt;li&gt;On subsequent edits, the script uses the stored ID to update the corresponding Dev.to article instead of creating duplicates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use an AI tool or write a script that:

&lt;ul&gt;
&lt;li&gt;Reads Markdown files with front matter (title, tags, etc.).&lt;/li&gt;
&lt;li&gt;Formats the content for the Dev.to API.&lt;/li&gt;
&lt;li&gt;Sends HTTP requests to publish articles using the Dev.to API key.&lt;/li&gt;
&lt;li&gt;Manages article IDs for update/overwrite support.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configure the GitHub Actions Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a workflow YAML file that:

&lt;ul&gt;
&lt;li&gt;Runs on push events (e.g., when articles are added or updated).&lt;/li&gt;
&lt;li&gt;Installs necessary dependencies (as specified by the script).&lt;/li&gt;
&lt;li&gt;Executes the Node.js script.&lt;/li&gt;
&lt;li&gt;Uses repository secrets to securely provide the Dev.to API key.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Store Secrets Securely&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add your Dev.to API key as a GitHub Actions secret (e.g., &lt;code&gt;DEVTO_API_KEY&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Publish Workflow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a new article is pushed, the workflow runs automatically.&lt;/li&gt;
&lt;li&gt;The script posts the article to Dev.to without manual intervention.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Important Notes for Dev.to API Usage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tag Limit:&lt;/strong&gt; The Dev.to API allows a maximum of 4 tags per article. If you specify more than 4 tags in your Markdown front matter, the API will return an error and the article will not be published. Always ensure your &lt;code&gt;tags&lt;/code&gt; array contains 4 or fewer items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling:&lt;/strong&gt; If the workflow fails, check the number of tags and other required fields in your article front matter first.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Notes for AI or Human Implementers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The actual code for the Node.js script and workflow file can be generated by an AI assistant or written manually.&lt;/li&gt;
&lt;li&gt;Ensure that dependencies (such as HTTP and Markdown parsing libraries) are included as needed.&lt;/li&gt;
&lt;li&gt;Follow best practices for API authentication and error handling.&lt;/li&gt;
&lt;li&gt;This workflow is adaptable: you can extend it to support other platforms or additional automation steps.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Example Use Case
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A user writes a Markdown article and pushes it to the repository.&lt;/li&gt;
&lt;li&gt;The GitHub Actions workflow is triggered.&lt;/li&gt;
&lt;li&gt;The AI-generated script publishes the article to Dev.to using the API.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This document serves as a conceptual guide. For concrete implementation, use an AI tool or refer to sample scripts and workflow files tailored to your needs.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devto</category>
      <category>automation</category>
      <category>node</category>
    </item>
    <item>
      <title>VanFS Released</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Sat, 04 May 2024 20:32:51 +0000</pubDate>
      <link>https://dev.to/kentechgeek/vanfs-released-1980</link>
      <guid>https://dev.to/kentechgeek/vanfs-released-1980</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04ban0te7zddzp42ifc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh04ban0te7zddzp42ifc.png" alt="vanfs-icon" width="250" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ken-okabe/vanfs"&gt;https://github.com/ken-okabe/vanfs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vanjs</category>
      <category>fsharp</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Does the functionality of Grouping operator () in JavaScript differ from Haskell or other programming languages?</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Thu, 30 Sep 2021 20:27:34 +0000</pubDate>
      <link>https://dev.to/kentechgeek/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haskell-or-other-programming-languages-1f20</link>
      <guid>https://dev.to/kentechgeek/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haskell-or-other-programming-languages-1f20</guid>
      <description>&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator ( )&lt;/a&gt; in JavaScript&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The grouping operator &lt;code&gt;( )&lt;/code&gt; controls the precedence of evaluation in expressions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;does Not differ from Haskell or other programming languages. (there is a minor exception as a byproduct of their main purpose in Lisp/Clojure)&lt;/p&gt;

&lt;p&gt;In other words, grouping operator &lt;code&gt;( )&lt;/code&gt; in every language shares the common functionality to compose &lt;a href="https://en.wikipedia.org/wiki/Dependency_graph" rel="noopener noreferrer"&gt;Dependency graph&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In mathematics, computer science and digital electronics, a dependency graph is a directed graph representing dependencies of several objects towards each other. It is possible to derive an &lt;strong&gt;evaluation order&lt;/strong&gt; or the absence of an evaluation order that respects the given dependencies from the dependency graph.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-ab7d2656b77f1d569cfd58d97cc8fb51" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-ab7d2656b77f1d569cfd58d97cc8fb51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-787c4c629035059338e086ab13376de7" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-787c4c629035059338e086ab13376de7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and the functionality of Grouping operator &lt;code&gt;( )&lt;/code&gt; itself is not affected by a &lt;a href="https://en.wikipedia.org/wiki/Evaluation_strategy" rel="noopener noreferrer"&gt;evaluation strategy&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Perhaps we can share the code below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;f() * (g() + h())&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to discuss the topic here, but not limited to the example.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-adb3170db726ab2ce616895beacdc94d" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-adb3170db726ab2ce616895beacdc94d"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Haskell
&lt;/h2&gt;

&lt;p&gt;In the code in Haskell where the evaluation strategy is &lt;strong&gt;Lazy / Call-by-need&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Lazy_evaluation" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Lazy_evaluation&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-b074554f1313334d923ff4c34e8a7d44" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-b074554f1313334d923ff4c34e8a7d44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this code, according to the call-by-need, the evaluation order of &lt;strong&gt;f g h&lt;/strong&gt; is&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;h(1) -&amp;gt; f(1) -&amp;gt; g(1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-28baa064e362db2c563d9a6b6bfb3dcd" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-28baa064e362db2c563d9a6b6bfb3dcd"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-05fbaee9793fd90d9cd2cfaa5d90c604" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-05fbaee9793fd90d9cd2cfaa5d90c604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this code, according to the call-by-need, the evaluation order of &lt;strong&gt;f g h&lt;/strong&gt; is&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;f(1) -&amp;gt; g(1) -&amp;gt; h(1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-4fa2aa62740f018d4a547a7cd5d7e0ab" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fqph.fs.quoracdn.net%2Fmain-qimg-4fa2aa62740f018d4a547a7cd5d7e0ab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//function definition  
const f = a =&amp;gt; a + 1;  
const g = a =&amp;gt; a + 2; 
const h = a =&amp;gt; a + 3; 

//calling functions 
console.log( 
(f(1) * g(1)) + h(1) 
); //10 
console.log( 
f(1) * (g(1) + h(1))   
); //14 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In this code, according to the eager-evaluation the evaluation order of &lt;strong&gt;f g h&lt;/strong&gt; is&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;f(1) -&amp;gt; g(1) -&amp;gt; h(1)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;in both cases.&lt;/p&gt;




&lt;p&gt;Either way, the regardless the evaluation strategies, since the dependency graph composed with Groping operator&lt;code&gt;()&lt;/code&gt; and &lt;code&gt;+&lt;/code&gt; &lt;code&gt;*&lt;/code&gt; stays identical, the final evaluated value is also identical.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TC39/proposal-pipeline-operator Hack-style |&gt; hijacks Grouping operator ( )</title>
      <dc:creator>Ken Okabe</dc:creator>
      <pubDate>Sat, 25 Sep 2021 23:28:23 +0000</pubDate>
      <link>https://dev.to/kentechgeek/the-current-tc39-proposal-pipeline-operator-hack-style-hijacks-grouping-operator-1dam</link>
      <guid>https://dev.to/kentechgeek/the-current-tc39-proposal-pipeline-operator-hack-style-hijacks-grouping-operator-1dam</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator" rel="noopener noreferrer"&gt;TC39 proposal  Hack Pipeline Operator&lt;/a&gt; &lt;code&gt;|&amp;gt;&lt;/code&gt; is incompatible with  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt; &lt;code&gt;()&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Short version
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt;  &lt;code&gt;( )&lt;/code&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The grouping operator  &lt;code&gt;( )&lt;/code&gt;  controls the precedence of evaluation in expressions.&lt;/p&gt;

&lt;p&gt;The grouping operator consists of a pair of parentheses around an expression or sub-expression to override the normal operator precedence so that  &lt;strong&gt;expressions with lower precedence can be evaluated before an expression with higher priority.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Test Code 1:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const f = a =&amp;gt; a * 2;
const g = a =&amp;gt; a + 1;

1 |&amp;gt; f(^) |&amp;gt; g(^);
1 |&amp;gt; (f(^) |&amp;gt; g(^));  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we made  &lt;code&gt;(f(^) |&amp;gt; g(^))&lt;/code&gt;  to be evaluated before other expressions with higher priority.&lt;/p&gt;

&lt;p&gt;I've investigated with Babel, and the transpiled result is identical, which means:&lt;br&gt;
 &lt;code&gt;(f(^) |&amp;gt; g(^))&lt;/code&gt;   is NOT evaluated before other expressions with the rule of Grouping operator &lt;code&gt;( )&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134595674-9a280ced-0fb3-4c04-ac91-9fd84e483404.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134595674-9a280ced-0fb3-4c04-ac91-9fd84e483404.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the current proposal  Hack &lt;code&gt;|&amp;gt;&lt;/code&gt; hijack the  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt;  ?&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Test Code 2:
&lt;/h3&gt;

&lt;p&gt;Now I have a &lt;code&gt;log&lt;/code&gt; function.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const right = a =&amp;gt; b =&amp;gt; b;
const log = a =&amp;gt; right(console.log(a))(a);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This behaves like identity function: &lt;code&gt;a =&amp;gt; a&lt;/code&gt; which does not affect to the original code but &lt;code&gt;console.log(a)&lt;/code&gt; in the process.&lt;/p&gt;

&lt;p&gt;Now, we want to know the evaluated value of &lt;code&gt;(f(%) |&amp;gt; g(%))&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 |&amp;gt; (log(f(%) |&amp;gt; g(%)));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This should be totally fine because &lt;code&gt;(f(%) |&amp;gt; g(%))&lt;/code&gt; must have some value of the evaluation according to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The grouping operator consists of a pair of parentheses around an expression or sub-expression to override the normal operator precedence so that &lt;strong&gt;expressions with lower precedence can be evaluated before an expression with higher priority.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F5%2F54%2FSome_babel_code.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F5%2F54%2FSome_babel_code.jpg" alt="File:Some babel code.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The vanilla JS code is:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var _ref, _ref2, _ref3, _ref4;
const id = a =&amp;gt; a;
const right = a =&amp;gt; b =&amp;gt; b;
const log = a =&amp;gt; right(console.log(a))(a);
const f = a =&amp;gt; a * 2;
const g = a =&amp;gt; a + 1;
_ref2 = 1, (_ref = f(_ref2), g(_ref));
_ref4 = 1, log((_ref3 = f(_ref4), g(_ref3)));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;and the result is:&lt;br&gt;
&lt;code&gt;3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Therefore,&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 |&amp;gt; (f(%) |&amp;gt; g(%));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;where  &lt;code&gt;(f(%) |&amp;gt; g(%))&lt;/code&gt; == &lt;code&gt;3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1 |&amp;gt; (f(%) |&amp;gt; g(%))&lt;/code&gt; &lt;br&gt;
 &lt;code&gt;==&lt;/code&gt;&lt;br&gt;
&lt;code&gt;1 |&amp;gt; 3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;???&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and the evaluation value of whole &lt;code&gt;1 |&amp;gt; (f(%) |&amp;gt; g(%))&lt;/code&gt;  is &lt;code&gt;3&lt;/code&gt;&lt;br&gt;
therefore,&lt;br&gt;
&lt;code&gt;1 |&amp;gt; 3 == 3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I have no idea for this hack-pipe-operator, and simply think this has broken the laws of Mathematics, and more importantly, it seems &lt;strong&gt;the current proposal  Hack &lt;code&gt;|&amp;gt;&lt;/code&gt; hijacks the  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The Babel implementation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926136875" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926136875&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Babel implementation has been done by &lt;a href="https://github.com/js-choi" rel="noopener noreferrer"&gt;@js-choi&lt;/a&gt; (one of the champions of the Hack pipes proposal).&lt;br&gt;&lt;br&gt;
The "reasonable stardard" is the spec proposal: either you learn how to read it (I'd be happy to help, if you are confused about any spec part), or you trust what who can read it says.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Issue
&lt;/h3&gt;

&lt;p&gt;In fact, I made an issue for this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the current proposal override the Grouping operator ( ) with Hack |&amp;gt; ?  #229&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/229" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/229&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134628159-8c1f10ec-e6c9-4a7a-b0bd-9c0948de65cf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134628159-8c1f10ec-e6c9-4a7a-b0bd-9c0948de65cf.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/229#issuecomment-926308352" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/229#issuecomment-926308352&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As had been explained already, parentheses don't work the way you seen to think they do. The result you're getting from Babel is entirely correct and expected, with exactly the same precedence and execution order that you'd get from parenthesizing a sequence of additions.&lt;/p&gt;

&lt;p&gt;As this question has been answered, I'm closing this thread.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F4%2F43%2FTc39_terms.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F4%2F43%2FTc39_terms.jpg" alt="File:Tc39 terms.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Issue closed with the tag of &lt;strong&gt;invalid&lt;/strong&gt;, well, I don't think so.&lt;/p&gt;

&lt;p&gt;@js-choi has explained to me for sure:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926317660" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926317660&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  @js-choi explanation
&lt;/h2&gt;

&lt;p&gt;Hm. Well…I don’t think anyone is admitting or covering anything up. But I’ll give it a shot; hopefully this will help a little. ^_^&lt;/p&gt;

&lt;p&gt;Parentheses change grouping. But they never have changed evaluation order, which is  &lt;em&gt;always&lt;/em&gt;  left to right, even  &lt;em&gt;outside&lt;/em&gt;  of parentheses. This is how JavaScript (and many other programming languages) have always been:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f () {
  console.log('F');
  return 3;
}

function g (x) {
  console.log('G');
  return x + 4;
}

function h (x) {
  console.log('H');
  return x * 7;
}

// This will print F then G then H, and it will result in 3 * 12, i.e., 36.
`f() * (g(1) + h(1))`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Note how the  &lt;code&gt;f()&lt;/code&gt;  evaluates first even before  &lt;code&gt;(g(1) + h(1))&lt;/code&gt;, despite  &lt;code&gt;(g(1) + h(1))&lt;/code&gt;  being in parentheses. That’s why F still prints first before G and H.&lt;/p&gt;

&lt;p&gt;Parenthesized expressions are not always evaluated first; expressions outside of the parentheses to the left are evaluated beforehand. This has how JavaScript (and many other languages like C and Lisp) have always been.&lt;/p&gt;

&lt;p&gt;Parentheses change grouping. But they have  &lt;em&gt;never&lt;/em&gt;  changed evaluation order, which is  &lt;em&gt;always&lt;/em&gt;  left to right, even  &lt;em&gt;outside&lt;/em&gt;  of parentheses. This is how JavaScript (and many other programming languages) have  &lt;em&gt;always&lt;/em&gt;  been:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// f, g, and h have the same definitions above.

// This will print F then G then H, and it will result in 3 * 12, i.e., 36.
f() * (g(1) + h(1))

// This will also print F then G then H, and it will result in 7 * 7, i.e., 49.
f() |&amp;gt; (g(^) |&amp;gt; h(^))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Note how the  &lt;code&gt;f()&lt;/code&gt;  evaluates first even before  &lt;code&gt;(g(1) + h(1))&lt;/code&gt;, despite  &lt;code&gt;(g(1) + h(1))&lt;/code&gt;  being in parentheses. That’s why F still prints first before G and H.&lt;/p&gt;

&lt;p&gt;This is the same reason why  &lt;code&gt;f() |&amp;gt; (g(^) |&amp;gt; h(^))&lt;/code&gt;  causes  &lt;code&gt;f()&lt;/code&gt;  to be evaluated before  &lt;code&gt;(g(^) |&amp;gt; h(^))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Just like how  &lt;code&gt;f() * (g(1) + h(1))&lt;/code&gt;  causes  &lt;code&gt;f()&lt;/code&gt;  to be evaluated before  &lt;code&gt;(g(1) + h(1))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It’s just the  &lt;em&gt;old&lt;/em&gt;  left-to-right evaluation rules. There aren’t any special grouping rules here. Parentheses change the grouping, but they  &lt;em&gt;never&lt;/em&gt;  have changed execution order from anything other than left to right.&lt;/p&gt;

&lt;p&gt;Hopefully that clears it up a little! I can understand why it might be a little confusing, but it’s just the old rules. Nothing is happening here except for the old JavaScript evaluation/parentheses rules. ^_^&lt;/p&gt;

&lt;p&gt;(Actually, perhaps I should also edit MDN’s documentation to make this clearer. Maybe this old parenthesized-expressions-are-not-always-evaluated-first rule is tripping up many people learning JavaScript.)&lt;/p&gt;
&lt;h2&gt;
  
  
  My explanation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926270855" rel="noopener noreferrer"&gt;#227 (comment)&lt;/a&gt;  &lt;a href="https://github.com/jridgewell" rel="noopener noreferrer"&gt;@jridgewell&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Notice the order "two", "three", "four" isn't affected by the parenthesis. Let's try (two() * three()) + four(). Surprise, it's still "two", "three", "four"! But now the final log is 10. That's because the operands are evaluated left to right, and this doesn't change. What changed was the evaluation of the operators.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926317660" rel="noopener noreferrer"&gt;#227 (comment)&lt;/a&gt;  &lt;a href="https://github.com/js-choi" rel="noopener noreferrer"&gt;@js-choi&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note how the f() evaluates first even before (g(1) + h(1)), despite (g(1) + h(1)) being in parentheses. That’s why F still prints first before G and H.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I observe, again, two of you share the same concept, and there are confusion of concepts . So I will explain to you. Hope it helps, really.&lt;/p&gt;
&lt;h3&gt;
  
  
  Confusion of concepts
&lt;/h3&gt;

&lt;p&gt;The problem you illustrated is not for inconsistency or limitation of the functionality of the Grouping operator  &lt;code&gt;( )&lt;/code&gt;  but &lt;a href="https://en.wikipedia.org/wiki/Evaluation_strategy" rel="noopener noreferrer"&gt;evaluation strategy&lt;/a&gt; of JS that is &lt;a href="https://en.wikipedia.org/wiki/Evaluation_strategy#Eager_evaluation" rel="noopener noreferrer"&gt;eager-evaluation&lt;/a&gt;, in this evaluation strategy, &lt;code&gt;f(x)&lt;/code&gt; is evaluated as soon as it is found from left to right, yes, you are only correct here.&lt;/p&gt;

&lt;p&gt;The only "safe" place is right side of lambda expressions: such as &lt;code&gt;a =&amp;gt; f(a)&lt;/code&gt;. In this case, even it's found by compiler &lt;code&gt;f(a)&lt;/code&gt; is safe! will not be evaluated. (the same goes to function statement). Therefore the technique is used to emulate lazy-evaluation. Another exception is &lt;code&gt;true || f(x)&lt;/code&gt; but &lt;code&gt;false || f(x)&lt;/code&gt; will be evaluated once found. Try it.&lt;/p&gt;

&lt;p&gt;Then point is, what you told us is &lt;strong&gt;nothing to do with the evaluation order of binary operator or Grouping operator &lt;code&gt;( )&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The eager evaluation strategy strictly follows the Algebraic rule.&lt;/strong&gt; Well, if you can find anomaly, show me :) &lt;strong&gt;It follows the rule of operators including Grouping operator () with no exceptions.&lt;/strong&gt; The eager evaluation of &lt;code&gt;f(x)&lt;/code&gt; never harms Algebraic expression in JS. If both of you have explained as if eager evaluation of &lt;code&gt;f(x)&lt;/code&gt; is the limit of the math in JS. That is the harmful explanation for us.&lt;/p&gt;

&lt;p&gt;Sure in your code, we will have F G H or two three four order and so what? Does it break the rule of the math or algebraic structure? Nah..&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Parentheses change grouping. But they never have changed evaluation order, which is always left to right, even outside of parentheses. This is how JavaScript (and many other programming languages) have always been:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, this is a false statement.&lt;/p&gt;

&lt;p&gt;The tricky word is: evaluation &lt;strong&gt;"order"&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note how the &lt;code&gt;f()&lt;/code&gt; evaluates first even before &lt;code&gt;(g(1) + h(1))&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So another tricky term should be : &lt;strong&gt;"before"&lt;/strong&gt; or &lt;strong&gt;"after"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In mathematics, when we use the term "order" "before" "after", does it mean time series? No way.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Does it mean the order of the line of terminal console?&lt;/p&gt;

&lt;p&gt;This logs:&lt;/p&gt;

&lt;p&gt;"two"&lt;/p&gt;

&lt;p&gt;"three"&lt;/p&gt;

&lt;p&gt;"four"&lt;/p&gt;

&lt;p&gt;14&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't matter in terms of math structure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What does matter is &lt;a href="https://en.wikipedia.org/wiki/Dependency_network" rel="noopener noreferrer"&gt;dependency network&lt;/a&gt; structure.&lt;/p&gt;

&lt;p&gt;Binary operation is merely a syntax-sugar of binary function, and when you chain them, you fundamentally compose the functions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FEzak8AuE-a_wm92oraHwb5YNxTOXM0mMCaINgELAS6KNRAd9vSOFub1-hTrnWLC-tBKKutHTQOfzDX1KHQgrUURzjuUDVjvYqnN9SCW4uaJecGTDMydystqnrJGIeFml_z3sJNEE%3Ds0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FEzak8AuE-a_wm92oraHwb5YNxTOXM0mMCaINgELAS6KNRAd9vSOFub1-hTrnWLC-tBKKutHTQOfzDX1KHQgrUURzjuUDVjvYqnN9SCW4uaJecGTDMydystqnrJGIeFml_z3sJNEE%3Ds0" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For instance, when you enjoy + binary operation, you guys repeatedly told me "left to right", but fundamentally you do&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FePh4ZCounDhhlLkx5sKhrOyeiAeeJHUTqDmKm7kAM_1Xvh03hm9hwYgKFAU37gjreDGqpogGayfmFWGVOUVM_kmGA5TOiLiDW-j5tg9ZIM9EZPniKSIcnDqwOae2jsiMwY-tPPWz%3Ds0" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh5.googleusercontent.com%2FePh4ZCounDhhlLkx5sKhrOyeiAeeJHUTqDmKm7kAM_1Xvh03hm9hwYgKFAU37gjreDGqpogGayfmFWGVOUVM_kmGA5TOiLiDW-j5tg9ZIM9EZPniKSIcnDqwOae2jsiMwY-tPPWz%3Ds0" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is Fold&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Fold_(higher-order_function)" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Fold_(higher-order_function)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are both left and right side fold, and usually we use foldLeft and if it's monoid the result is the same of both side.&lt;/p&gt;

&lt;p&gt;As you seen, this is a Graph. &lt;a href="https://en.wikipedia.org/wiki/Dependency_graph" rel="noopener noreferrer"&gt;Dependency graph&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In mathematics, computer science and digital electronics, a dependency graph is a directed graph representing dependencies of several objects towards each other. It is possible to derive an &lt;strong&gt;evaluation order&lt;/strong&gt; or the absence of an &lt;strong&gt;evaluation order&lt;/strong&gt; that respects the given dependencies from the dependency graph.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Remember "evaluation order" derived from the dependency graph or structure is completely different concept of "time order" of executions.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Hack pipe
&lt;/h3&gt;

&lt;p&gt;Hack pipe, on the other hand, unlike eager evaluation strategy, this does break the math structure, and again this one overrides Grouping Operator ( ). I meant in dependency base. This problem is elaborated in my previous post &lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926371664" rel="noopener noreferrer"&gt;#227 (comment)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't think it's on purpose, but the confusion of concept of Evaluation strategy and Algebraic structure is harmfully explained to justify the false design of Hack pipe that overrides the operator with the highest precedence in JS.&lt;/p&gt;

&lt;p&gt;I will maintain my claim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/229" rel="noopener noreferrer"&gt;Does the current proposal override the Grouping operator ( ) with Hack |&amp;gt; ?&lt;/a&gt;  &lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/229" rel="noopener noreferrer"&gt;#229&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Deletion of my explanation
&lt;/h2&gt;

&lt;p&gt;@js-choi&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s just the  &lt;em&gt;old&lt;/em&gt;  left-to-right evaluation rules. There aren’t any special grouping rules here. Parentheses change the grouping, but they  &lt;em&gt;never&lt;/em&gt;  have changed execution order from anything other than left to right.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So this is a false statement.&lt;/p&gt;

&lt;p&gt;So why there's no link to my explanation? Deleted by them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F9%2F99%2FDelete_comments.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F9%2F99%2FDelete_comments.jpg" alt="File:Delete comments.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926737650" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926737650&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have just deleted several comments from &lt;a href="https://github.com/stken2050" rel="noopener noreferrer"&gt;@stken2050&lt;/a&gt; (and a few responses to them from others) that were explicitly continuing the confused argument about parentheses that I said just a few hours ago to &lt;em&gt;not&lt;/em&gt; continue. I'm closing and locking this thread, and pursuing separate moderation actions, as I said I would if this behavior continued.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;that were explicitly continuing the confused argument about parentheses that I said just a few hours ago to &lt;em&gt;not&lt;/em&gt; continue.&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;So individuals who are confused are not me but the members to promote this Hack proposal, and they believe they have a power to tell which argument is to be allowed to continue or not. In other words, this is an abuse of power or Censorship to justify their own proposal for their own interest to achieve the standardization of this false Hacked product.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sure, I claimed to TC39, and I've got a mail from an individual on behalf of TC39 Chairs &amp;amp; CoC Committee:&lt;br&gt;
&lt;a href="https://gist.github.com/stken2050/5eff7d2a792cd2b9e773b09c64fd26da" rel="noopener noreferrer"&gt;https://gist.github.com/stken2050/5eff7d2a792cd2b9e773b09c64fd26da&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Therefore, I understand TC39 has justified their abuse of power of censorship, and Banned me for 2 weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT (2021/9/28):&lt;/strong&gt;&lt;br&gt;
Now they added a false statement to the MDN page of  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt; &lt;code&gt;( )&lt;/code&gt;, for the purpose of justifying their own proposal that is based on the confusion of the concept:  &lt;strong&gt;"evaluation order" derived from the dependency graph or structure is completely different concept of "time order" of executions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Please confirm here:&lt;br&gt;
&lt;a href="https://github.com/mdn/content/pull/9389" rel="noopener noreferrer"&gt;Description confusing concepts clarified  #9389&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;The point of view here has been shared in &lt;a href="https://stackoverflow.com/questions/69384610/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haske/69386130" rel="noopener noreferrer"&gt;stack overflow question&lt;/a&gt; , and &lt;a href="https://stackoverflow.com/a/69386130/11316608" rel="noopener noreferrer"&gt;a third person confirmed the fact as the answer&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Grouping parentheses mean the same thing in Haskell as they do in high school mathematics. They group a sub-expression into a single term. This is also what they mean in Javascript and most other programming language,&lt;/p&gt;

&lt;p&gt;A language needs other rules beyond just the grouping of sub-expressions to pin down evaluation order (if it wants to specify the order), whether it's strict or lazy. So since you need other rules to determine it anyway, &lt;strong&gt;it is best (in my opinion) to think of evaluation order as a totally separate concept than grouping.&lt;/strong&gt; &lt;strong&gt;Mixing them up seems like a shortcut when you're learning high school mathematics, but it's just a handicap in more general settings.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore, for the explanation of Grouping operator (parentheses) itself, the priority of the article should be to focus the functionality given as the meaning of  "high school mathematics".&lt;/p&gt;

&lt;p&gt;The wording of old version "operands" of "preserved" actively misleads readers to confuse the  "high school mathematics" principle of the Grouping operator and the evaluation strategy of JavaScript runtime. &lt;/p&gt;

&lt;p&gt;If anyone think such an example is required and to be included in this page, they need to explain thoroughly for readers to avoid the confusion of concepts between the mathematical aspect and evaluation strategy that the latter is essentially off-topic here.&lt;/p&gt;


&lt;h4&gt;
  
  
  Reference material
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://dev.to/stken2050/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haskell-or-other-programming-languages-1f20"&gt;Does the functionality of Grouping operator () in JavaScript differ from Haskell or other programming languages?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/a/69386130/11316608" rel="noopener noreferrer"&gt;https://stackoverflow.com/a/69386130/11316608&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Long version
&lt;/h1&gt;
&lt;h2&gt;
  
  
  What is grouping-operator?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt; &lt;code&gt;( )&lt;/code&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The grouping operator &lt;code&gt;( )&lt;/code&gt; controls the precedence of evaluation in expressions.&lt;/p&gt;

&lt;p&gt;The grouping operator consists of a pair of parentheses around an expression or sub-expression to override the normal operator precedence so that &lt;strong&gt;expressions with lower precedence can be evaluated before an expression with higher priority.&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Grouping operator &lt;code&gt;( )&lt;/code&gt; itself has the highest precedence in JavaScript.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence" rel="noopener noreferrer"&gt;Operator precedence&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpp67pkm1nrx41ej85ba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgpp67pkm1nrx41ej85ba.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is pipeline-operator?
&lt;/h2&gt;

&lt;p&gt;In a general sense, pipeline-operator &lt;code&gt;|&amp;gt;&lt;/code&gt; is a &lt;a href="https://en.wikipedia.org/wiki/Binary_operation" rel="noopener noreferrer"&gt;binary operator&lt;/a&gt;  for  &lt;a href="https://en.wikipedia.org/wiki/Function_application" rel="noopener noreferrer"&gt;function application&lt;/a&gt; that is  equivalent to  &lt;code&gt;f(x)&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;code&gt;f(x)&lt;/code&gt; == &lt;code&gt;x |&amp;gt; f&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Benefit of binary operator
&lt;/h2&gt;

&lt;p&gt;Introducing a new binary-operator in JavaScript is nothing new.&lt;/p&gt;

&lt;p&gt;In ES2016,  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation" rel="noopener noreferrer"&gt;exponentiation operator&lt;/a&gt; &lt;code&gt;**&lt;/code&gt; has been introduced. &lt;br&gt;
&lt;code&gt;Math.pow(2, 3)&lt;/code&gt; == &lt;code&gt;2 ** 3&lt;/code&gt; &lt;br&gt;
&lt;code&gt;Math.pow(Math.pow(2, 3), 5)&lt;/code&gt; == &lt;code&gt;2 ** 3 ** 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;As you can see, a binary operator significantly improve the readability of a code, especially for the nesting structure of &lt;code&gt;f()&lt;/code&gt; &lt;a href="https://en.wikipedia.org/wiki/Mathematical_notation" rel="noopener noreferrer"&gt;notation&lt;/a&gt;,&lt;/p&gt;

&lt;p&gt;Essentially, pipeline-operator is the same league of the exponentiation operator, and the benefit is also common.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;g(f(x)&lt;/code&gt; == &lt;code&gt;x |&amp;gt; f |&amp;gt; g&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Expectation of the community
&lt;/h2&gt;

&lt;p&gt;In fact, pipeline-operator in JS has been expected from the community.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://2020.stateofjs.com/en-US/opinions/missing_from_js" rel="noopener noreferrer"&gt;#StateOfJS 2020: What do you feel is currently missing from JavaScript?&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133777701-55ffaa00-bede-4699-a907-fe85242ab82b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133777701-55ffaa00-bede-4699-a907-fe85242ab82b.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Static Typing&lt;/li&gt;
&lt;li&gt;  Pattern Matching&lt;/li&gt;
&lt;li&gt;  Pipe Operator&lt;/li&gt;
&lt;li&gt;  functions&lt;/li&gt;
&lt;li&gt;  Immutable Data Structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's reasonable to observe that the majority of the JS community has longed for more strictness of the language.&lt;/p&gt;

&lt;p&gt;Especially for  &lt;strong&gt;Static Typing&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134413770-55b00540-bde7-4b5c-ac84-9bbfa5a1371c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134413770-55b00540-bde7-4b5c-ac84-9bbfa5a1371c.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Static Typing is so popular?
&lt;/h2&gt;

&lt;p&gt;There is no native static &lt;a href="https://en.wikipedia.org/wiki/Type_system" rel="noopener noreferrer"&gt;type system&lt;/a&gt; in JavaScript, so currently, many use TypeScript instead.&lt;br&gt;
So why do we like Type so much?&lt;/p&gt;

&lt;p&gt;The general answer would be that we can avoid BUGs, in other words Type makes a code robust.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Type makes a code robust?
&lt;/h2&gt;

&lt;p&gt;Because Type is mathematics.&lt;br&gt;
I will explain briefly about Type since I think the understanding helps readers follow this discussion.&lt;/p&gt;
&lt;h2&gt;
  
  
  Types as Sets
&lt;/h2&gt;

&lt;p&gt;Type == Sets&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://ncatlab.org/nlab/show/type+theory#type_theory_versus_set_theory" rel="noopener noreferrer"&gt;Type theory versus set theory&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Alternately, we could change our terminology so that what we have been calling “types” are instead called “sets”.&lt;/p&gt;

&lt;p&gt;Thus, words like “type” and “set” and “class” are really quite fungible. This sort of level-switch is especially important when we want to study the mathematics &lt;em&gt;of&lt;/em&gt; type theory,&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://guide.elm-lang.org/appendix/types_as_sets.html" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;a href="https://guide.elm-lang.org/appendix/types_as_sets.html" rel="noopener noreferrer"&gt;Types as Sets · An Introduction to Elm&lt;/a&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In pursuit of this goal, I have found it helpful to understand the relationship between types and sets. It sounds like a stretch, but it really helps develop your mindset!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What is Sets?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Definition of Function
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Function_(mathematics)#Definition" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Function_(mathematics)#Definition&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Intuitively, a function is a process that associates each element of a set &lt;em&gt;X&lt;/em&gt;, to a single element of a set &lt;em&gt;Y&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://ncatlab.org/nlab/show/function" rel="noopener noreferrer"&gt;https://ncatlab.org/nlab/show/function&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In a strict sense of the term, a &lt;strong&gt;function&lt;/strong&gt; is a &lt;a href="https://ncatlab.org/nlab/show/homomorphism" rel="noopener noreferrer"&gt;homomorphism&lt;/a&gt;  f:S→Tf : S \to T of &lt;a href="https://ncatlab.org/nlab/show/sets" rel="noopener noreferrer"&gt;sets&lt;/a&gt;. We may also speak of a &lt;strong&gt;&lt;a href="https://ncatlab.org/nlab/show/map" rel="noopener noreferrer"&gt;map&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;mapping&lt;/strong&gt;, but those terms are used in other ways in other contexts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, in the definition of function, we need to define the sets of &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;&lt;br&gt;
where &lt;code&gt;y = f(x)&lt;/code&gt;, or  &lt;code&gt;x |&amp;gt; y&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A binary operator is a syntax-sugar of binary functions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Binary_operation" rel="noopener noreferrer"&gt;Binary operation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F7%2F79%2FBinary_operations_as_black_box.svg%2F220px-Binary_operations_as_black_box.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2F7%2F79%2FBinary_operations_as_black_box.svg%2F220px-Binary_operations_as_black_box.svg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the picture,&lt;br&gt;
&lt;code&gt;x * y == f(x, y)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or should I edit this picture to&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F23%2FPipeline_operator.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F23%2FPipeline_operator.png" alt="File:Pipeline operator.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A binary operator is a syntax-sugar of binary functions.&lt;br&gt;
We also need to type (== sets) &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; or  &lt;code&gt;f&lt;/code&gt; correctly as the request from the mathematical definition of function, and according to the overwhelming popularity of &lt;strong&gt;Static Typing&lt;/strong&gt; in the survey, that is what people want. They needs more strictness of JavaScript for their robust codes.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;x |&amp;gt; f === f(x)&lt;/code&gt;, essentially it's clearly typed:&lt;/p&gt;

&lt;p&gt;x : JavaScript Objects&lt;br&gt;
f : Function&lt;/p&gt;

&lt;p&gt;Then, since this is &lt;code&gt;f(x)&lt;/code&gt;,  the type(==sets) of &lt;code&gt;x&lt;/code&gt; should be defined along with the definition of &lt;code&gt;f&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is what people want.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hack-style reached Stage-2
&lt;/h2&gt;

&lt;p&gt;Recently, I have noticed JS pipeline-operator has reached TC-39 Stage-2, so I have examined:&lt;br&gt;
 &lt;a href="https://github.com/tc39" rel="noopener noreferrer"&gt;tc39&lt;/a&gt;/&lt;strong&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator" rel="noopener noreferrer"&gt;proposal-pipeline-operator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Pipe Operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;) for JavaScript
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Why the Hack pipe operator
&lt;/h4&gt;

&lt;p&gt;There were  &lt;strong&gt;two competing proposals&lt;/strong&gt;  for the pipe operator: Hack pipes and F# pipes. (Before that, there  &lt;strong&gt;was&lt;/strong&gt;  a  &lt;a href="https://github.com/js-choi/proposal-smart-pipelines/" rel="noopener noreferrer"&gt;third proposal for a “smart mix” of the first two proposals&lt;/a&gt;, but it has been withdrawn, since its syntax is strictly a superset of one of the proposals’.)&lt;/p&gt;

&lt;p&gt;The two pipe proposals just differ  &lt;strong&gt;slightly&lt;/strong&gt;  on what the “magic” is, when we spell our code when using  &lt;code&gt;|&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  This proposal: Hack pipes
&lt;/h4&gt;

&lt;p&gt;In the  &lt;strong&gt;Hack language&lt;/strong&gt;’s pipe syntax, the righthand side of the pipe is an  &lt;strong&gt;expression&lt;/strong&gt;  containing a special  &lt;strong&gt;placeholder&lt;/strong&gt;, which is evaluated with the placeholder bound to the result of evaluating the lefthand side's expression. That is, we write  &lt;code&gt;value |&amp;gt; one(^) |&amp;gt; two(^) |&amp;gt; three(^)&lt;/code&gt;  to pipe  &lt;code&gt;value&lt;/code&gt;  through the three functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro:&lt;/strong&gt;  The righthand side can be  &lt;strong&gt;any expression&lt;/strong&gt;, and the placeholder can go anywhere any normal variable identifier could go, so we can pipe to any code we want  &lt;strong&gt;without any special rules&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; foo(^)&lt;/code&gt;  for unary function calls,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; foo(1, ^)&lt;/code&gt;  for n-ary function calls,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; ^.foo()&lt;/code&gt;  for method calls,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; ^ + 1&lt;/code&gt;  for arithmetic,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; [^, 0]&lt;/code&gt;  for array literals,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; {foo: ^}&lt;/code&gt;  for object literals,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; `${^}`&lt;/code&gt;  for template literals,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; new Foo(^)&lt;/code&gt;  for constructing objects,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; await ^&lt;/code&gt;  for awaiting promises,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; (yield ^)&lt;/code&gt;  for yielding generator values,&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value |&amp;gt; import(^)&lt;/code&gt;  for calling function-like keywords,&lt;/li&gt;
&lt;li&gt;  etc.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;What??&lt;/strong&gt; &lt;br&gt;
I had a hope for &lt;code&gt;value |&amp;gt; f&lt;/code&gt; is still valid, but syntax-error.&lt;/p&gt;

&lt;p&gt;The type of right hand side of  &lt;code&gt;|&amp;gt;&lt;/code&gt; is no longer function but &lt;strong&gt;something unknown&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reactions
&lt;/h2&gt;

&lt;p&gt;I investigated the issue of this proposal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  #200: Added value of hack-style proposal against temporary variables
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/200" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/200&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  #202: Separate (complementary) F# pipeline proposal?
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/202" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/202&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  #205: Hack is dead. Long live F#.
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/205" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/205&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  #206: Should enabling point-free programming/APIs be a goal of the Pipeline Operator?
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/206" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/206&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In fact, &lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/205" rel="noopener noreferrer"&gt;#205: Hack is dead. Long live F#.&lt;/a&gt;  has 199 comments and now closed by moderator.&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/205#issuecomment-918717394" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/205#issuecomment-918717394&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a huge thread and reading there, I've watched the issue was closed in real-time.&lt;/p&gt;

&lt;p&gt;Here are few comments I've found around threads:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/205#issuecomment-918366356" rel="noopener noreferrer"&gt;#205 (comment)&lt;/a&gt;  &lt;a href="https://github.com/jderochervlk" rel="noopener noreferrer"&gt;@jderochervlk&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The future of functional programming is Hack pipe&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nope. It isn't. If this is truly what became added to the language I would continue to use Ramda's  &lt;code&gt;pipe&lt;/code&gt;, which is a shame because I would really love to remove some overhead of installing a package in order to do something so simple.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/205#issuecomment-918578339" rel="noopener noreferrer"&gt;#205 (comment)&lt;/a&gt;  &lt;a href="https://github.com/samhh" rel="noopener noreferrer"&gt;@samhh&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm thinking ahead. JavaScript won't cease to exist once Hack reaches stage 4.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/215#issuecomment-923161293" rel="noopener noreferrer"&gt;#215 (comment)&lt;/a&gt;  &lt;a href="https://github.com/arendjr" rel="noopener noreferrer"&gt;@arendjr&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I would rather have the language remain without any pipe operator than to have to deal with Hack in the future.&lt;br&gt;&lt;br&gt;
I too would like to thank  &lt;a href="https://github.com/js-choi" rel="noopener noreferrer"&gt;@js-choi&lt;/a&gt;  and the other contributors for all their effort, but I believe the current direction to be misguided to the detriment of not just the FP community, but the JS community at large.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/225#issuecomment-924508816" rel="noopener noreferrer"&gt;#225 (comment)&lt;/a&gt;  &lt;a href="https://github.com/voronoipotato" rel="noopener noreferrer"&gt;@voronoipotato&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The argument against hack pipes is that we believe they are a hazard (sometimes for different reasons, but the conclusion is the same). Most of us in this thread and I suspect in the wild, would rather have no pipes, than hack pipes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/225#issuecomment-922983854" rel="noopener noreferrer"&gt;#225 (comment)&lt;/a&gt;  &lt;a href="https://github.com/SRachamim" rel="noopener noreferrer"&gt;@SRachamim&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PFA proposal is a universal solution to those who worries about the arrow function noise on all three cases: map, then and pipe. If PFA is not ready, and we don't want minimal/F# without PFA, then let's wait, instead of introducing an irreversible Hack pipes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/225#issuecomment-923003812" rel="noopener noreferrer"&gt;#225 (comment)&lt;/a&gt;  &lt;a href="https://github.com/SRachamim" rel="noopener noreferrer"&gt;@SRachamim&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;And as I said, if PFA is stuck, then it's not a good reason to introduce Hack. We should either wait, or avoid pipe at all (or introduce minimal/f# style anyway).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/225#issuecomment-924261193" rel="noopener noreferrer"&gt;#225 (comment)&lt;/a&gt;  &lt;a href="https://github.com/Lokua" rel="noopener noreferrer"&gt;@Lokua&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Also, as a writer whose job is to communicate meaning, hack style removes my ability to provide descriptive names, which is basically the universal first step of writing readable code. I'm honestly shocked at this proposal. Imagine if you started at a new company and they enforced that all unary functions you write regardless of context had to name their single argument  &lt;code&gt;x&lt;/code&gt;  (or god forbid,  &lt;code&gt;^&lt;/code&gt;  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Fimages%2Ficons%2Femoji%2Ftrollface.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Fimages%2Ficons%2Femoji%2Ftrollface.png" title=":trollface:" alt=":trollface:"&gt;&lt;/a&gt;). That's how I feel and I'm not exaggerating - this proposal scares me because it's going to lead to code that is uglier, harder to read, and harder to refactor/abstract later on!&lt;br&gt;&lt;br&gt;
Edit: I too would rather see no pipe than this and am admittedly biased as I've always thought a pipe operator (or pretty much any more new syntax) is a bad idea. But if we are going to have it, I'd rather see it implemented in a way that improves readability, not (IMHO) hinders it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've found they claim it's far better not to have any pipe than to have hack-style because they evaluated the one harmful to JavaScript.&lt;/p&gt;

&lt;p&gt;This is a comment by RxJS auhthor&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/228#issuecomment-925465598" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/228#issuecomment-925465598&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've been told several influential members want to discourage point-free programming. Therefore, anything that might help functional programming libraries is unlikely to pass the TC39. It is what it is. It's the hack proposal or nothing. IMO, the hack proposal isn't useful enough to justify the additional syntax. But I'm not on the committee&lt;/p&gt;

&lt;p&gt;Please don't @ me into these threads. I've said my piece. Pretty thoroughly. I wasn't really heard. And I lost a friend over it. I simply just don't care what happens with this anymore. If it passes, great. Unfortunately, I don't really have any use for the proposed pipeline operator. But I'm hopeful for other features someday that I will have a use for.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  History of the proposal
&lt;/h2&gt;

&lt;p&gt;I think it's fair to share the history posted by a project member @js-choi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator/blob/main/HISTORY.md" rel="noopener noreferrer"&gt;Brief history of the JavaScript pipe operator&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  My study on Hack
&lt;/h2&gt;

&lt;p&gt;In fact, I had to study the Hack-style-pipeline-operator.&lt;br&gt;
I had no idea what this is.&lt;br&gt;
&lt;strong&gt;For the minimal/F# proposal, it's merely &lt;code&gt;x |&amp;gt; f === f(x)&lt;/code&gt; , so simple, no requirement to study.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had joined issues, and also I've opened a couple of issues by myself, and actually lots of text here is copy&amp;amp;paste of my own comment there.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pipeline-operator in a mathematical sense
&lt;/h2&gt;

&lt;p&gt;Before I discuss Hack pipe, I share my knowledge on the pipeline-operator in a mathematical sense that is &lt;br&gt;
&lt;code&gt;x |&amp;gt; f === f(x)&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Associative property and Monoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Addition&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Addition#General_theory" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Addition#General_theory&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;General theory&lt;br&gt;&lt;br&gt;
The general theory of abstract algebra allows an "addition" operation to be any  &lt;strong&gt;associative&lt;/strong&gt;  and commutative operation on a set. Basic algebraic structures with such an addition operation include commutative  &lt;strong&gt;monoids&lt;/strong&gt;  and abelian groups.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here the important property is associative&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(1 + 2) + 3 = 
1 + 2 + 3 = 
1 + (2 + 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JS String is also has associative property, and they are called &lt;a href="https://en.wikipedia.org/wiki/Monoid" rel="noopener noreferrer"&gt;Monoid&lt;/a&gt; in algebra.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In abstract algebra, a branch of mathematics, a &lt;strong&gt;monoid&lt;/strong&gt; is a set equipped with &lt;strong&gt;an associative binary operation&lt;/strong&gt; and an identity element.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Associativity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For all a, b and c in S, the equation  &lt;code&gt;(a • b) • c = a • (b • c)&lt;/code&gt;  holds.&lt;/p&gt;

&lt;p&gt;In computer science and computer programming, the set of strings built from a given set of characters is a free monoid.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What does this mean?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Hello" + " " + "operator" ==
"Hello " + "operator" ==
"Hello" + " operator" ==
"Hello operator"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strings and  &lt;code&gt;+&lt;/code&gt;  the binary operator in JS is a Monoid, and as you know this String operator is very easy to use and robust.&lt;/p&gt;

&lt;p&gt;Monoid or associative property has rock solid structure because it's hardly broken.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Imagine LEGO block, that is also Monoid, the order to construct block does not effect the result:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(A + B) + C = 
A + B + C = 
A + (B + C)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any order to construction of the combination of LEGO bock reaches the identical result. So in software development if the entity has Monoid property, we can treat it as if LEGO block. That's the virtue of Monoid. Just its like LEGO, wonderful stuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without the associative property, we will experience &lt;a href="https://en.wikipedia.org/wiki/Combinatorial_explosion" rel="noopener noreferrer"&gt;Combinatorial explosion&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In &lt;a href="https://en.wikipedia.org/wiki/Mathematics" rel="noopener noreferrer"&gt;mathematics&lt;/a&gt;, a &lt;strong&gt;combinatorial explosion&lt;/strong&gt; is the rapid growth of the complexity of a problem due to how the &lt;a href="https://en.wikipedia.org/wiki/Combinatorics" rel="noopener noreferrer"&gt;combinatorics&lt;/a&gt; of the problem is affected by the input, constraints, and bounds of the problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The history of software development is the war against complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In fact, Associativity is one of the most important concept in programming and Associativity is the key to avoid the software complexity that is the fundamental reason of BUGs . In other words, as long as we are very carful to keep things with associative property, we safely can avoid complexity and obtain a bug-free code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So Associativity is important,  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation" rel="noopener noreferrer"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Exponentiation&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622162-0126479a-8741-4440-a431-f3b050c5a650.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622162-0126479a-8741-4440-a431-f3b050c5a650.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They care a lot.&lt;/p&gt;
&lt;h2&gt;
  
  
  Function composition as a Monoid
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Monoid" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Monoid&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, &lt;strong&gt;the functions from a set into itself form a monoid with respect to function composition&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I will explain this.&lt;/p&gt;

&lt;p&gt;One of "the functions from a set into itself" is addition.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// function from a set into itself
const f = a =&amp;gt; a + 1; // f: number -&amp;gt; number 
const g = a =&amp;gt; a + 2; // g; number -&amp;gt; number 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133987130-1d809aac-b322-4964-975e-865cf8c946e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133987130-1d809aac-b322-4964-975e-865cf8c946e9.png" alt="image"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133987268-d4ca147e-71ac-4e18-9567-e213dae96fcf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F133987268-d4ca147e-71ac-4e18-9567-e213dae96fcf.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622508-49c2a242-f4ae-42d8-84a1-3332cb6c999a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622508-49c2a242-f4ae-42d8-84a1-3332cb6c999a.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622390-c397558b-36a6-45a4-a026-e9202e88f13c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622390-c397558b-36a6-45a4-a026-e9202e88f13c.png" alt="image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  please note I use the composition operator for g(f(x)) not  &lt;code&gt;g.f&lt;/code&gt;  but  &lt;code&gt;f.g&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f |&amp;gt; g   ===
a |&amp;gt; (f . g) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is the simple structure of&lt;br&gt;
Function application (pipeline-operator)&lt;br&gt;
Function composition (composition-operator).&lt;/p&gt;

&lt;p&gt;They are the both side of the same coin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622406-9d78fb22-9bea-4e28-bc8a-b87f6e6637a4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134622406-9d78fb22-9bea-4e28-bc8a-b87f6e6637a4.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(f.g).h === f.g.h === f.(g.h)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Therefore, &lt;strong&gt;function composition is Monoid&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f |&amp;gt; g |&amp;gt; h ===
a |&amp;gt; f |&amp;gt; (g . h) ===
a |&amp;gt; f . (g . h) ===
a |&amp;gt; (f . g) |&amp;gt; h ===
a |&amp;gt; (f . g) . h ===
a |&amp;gt; (f . g . h) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where  &lt;code&gt;f.g&lt;/code&gt;  is the composition of  &lt;code&gt;f&lt;/code&gt;  and  &lt;code&gt;g&lt;/code&gt;&lt;br&gt;&lt;br&gt;
(in traditional math style is  &lt;code&gt;g.f&lt;/code&gt;  regarding  &lt;code&gt;g(f)&lt;/code&gt;  but I don't use this style )&lt;/p&gt;

&lt;p&gt;This is the whole picture you should know, and as you can see:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;function application  &lt;code&gt;|&amp;gt;&lt;/code&gt;  is not associative and not Monoid.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f |&amp;gt; g   !=
a |&amp;gt; (f |&amp;gt; g) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The &lt;code&gt;(f |&amp;gt; g)&lt;/code&gt;  does not make sense and the Type==Sets is violated in terms of &lt;code&gt;x |&amp;gt; f&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;However, this is what the Hack style is doing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const f = a =&amp;gt; a * 2;
const g = a =&amp;gt; a + 1;

1 |&amp;gt; f(^) |&amp;gt; g(^);    //3
1 |&amp;gt; (f(^) |&amp;gt; g(^));  //3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;(f(^) |&amp;gt; g(^))&lt;/code&gt; is also evaluated as &lt;code&gt;3&lt;/code&gt;,&lt;br&gt;
 with the higher priority of general rule of Mathematics or grouping-operator &lt;code&gt;()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;as a result&lt;/p&gt;

&lt;p&gt;&lt;code&gt;1 |&amp;gt; 3 == 3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This does not make sense at all, and the fundamental reason is they simply violates the rule of mathematics.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Monad
&lt;/h2&gt;

&lt;p&gt;Pipeline-operator  &lt;code&gt;|&amp;gt;&lt;/code&gt;  and function application does not have associative property in Monoid layer, but the  form&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f |&amp;gt; g   ===
a |&amp;gt; (f . g) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is also called Associativity in Monad layer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wiki.haskell.org/Monad_laws" rel="noopener noreferrer"&gt;https://wiki.haskell.org/Monad_laws&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monad laws&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134077688-3eef39bf-52ea-48ca-b569-dac3910af75b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134077688-3eef39bf-52ea-48ca-b569-dac3910af75b.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For your convenience, I would rewrite to&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Associativity:&lt;/strong&gt;  &lt;code&gt;(m |&amp;gt; g ) |&amp;gt; h === m |&amp;gt; (x =&amp;gt; g(x) |&amp;gt; h)&lt;/code&gt;&lt;br&gt;
or &lt;br&gt;
&lt;strong&gt;Associativity:&lt;/strong&gt;  &lt;code&gt;(m |&amp;gt; g ) |&amp;gt; h === m |&amp;gt; (x =&amp;gt; x |&amp;gt; g |&amp;gt; h)&lt;/code&gt;&lt;br&gt;
as  &lt;code&gt;(x =&amp;gt; x |&amp;gt; g |&amp;gt; h)&lt;/code&gt;  is the function composition of  &lt;code&gt;g&lt;/code&gt;  and  &lt;code&gt;h&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Associativity:&lt;/strong&gt;  &lt;code&gt;(m |&amp;gt; g ) |&amp;gt; h === m |&amp;gt; (g . h)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;left-right identity&lt;/strong&gt;,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134623182-32783f14-876b-4ecb-a6ee-abc3d9f32ad9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134623182-32783f14-876b-4ecb-a6ee-abc3d9f32ad9.png" alt="image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;with identify function:  &lt;code&gt;id= x =&amp;gt; x&lt;/code&gt; &lt;br&gt;
For every Function:  &lt;code&gt;f: A -&amp;gt;B&lt;/code&gt;&lt;br&gt;
If this forms, the algebraic structure is called &lt;strong&gt;Monad&lt;/strong&gt;.&lt;br&gt;
&lt;em&gt;Note: this corresponds to Monoid has associativity and identify&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function Application  &lt;code&gt;|&amp;gt;&lt;/code&gt;  Monad&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function Composition  &lt;code&gt;.&lt;/code&gt;  Monoid also Monad (obvious, but prove by yourself)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So mathematically,  &lt;strong&gt;&lt;code&gt;|&amp;gt;&lt;/code&gt;  is Monad, not Monoid&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;FYI, &lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap" rel="noopener noreferrer"&gt;Array.prototype.flatMap()&lt;/a&gt; introduced in ES2019&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-flatMap" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-flatMap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-flatMap/issues/10" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-flatMap/issues/10&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This proposal essentially gives native Arrays the methods they need to work as &lt;strong&gt;Monads&lt;/strong&gt; (without having to extend the prototype).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They add &lt;code&gt;flatMap&lt;/code&gt; on purpose  as Monad on top of the &lt;code&gt;Map&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pipeline-operator &lt;code&gt;|&amp;gt;&lt;/code&gt; in the mathematical sense of function application is &lt;strong&gt;natively Monad that behaves pretty well with the rock-solid structure&lt;/strong&gt; that majorities of programmers in JavaScript desired for, and now, Hack pipe destroys that.  No respect to Mathematics.&lt;/p&gt;
&lt;h2&gt;
  
  
  Math structure of Hack pipe
&lt;/h2&gt;

&lt;p&gt;F# pipe is simply mathematical function application, it behaves like Monad, so it's natural it does not behave Associative in Monoid.&lt;/p&gt;

&lt;p&gt;Hack pipe, on the other hand, it behave like Associative and Monoid,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f(^) |&amp;gt; g(^)   == 
a |&amp;gt; (f(^) |&amp;gt; g(^)) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but this is not a monoid.&lt;br&gt;
Something unknown to leads:&lt;br&gt;
&lt;code&gt;1 |&amp;gt; 3 == 3&lt;/code&gt;&lt;br&gt;
This is something completely different from Function application in mathematical sense.&lt;br&gt;&lt;br&gt;
This one breaks the Algebraic structure that I've explained so far.&lt;br&gt;
&lt;strong&gt;Function application is NOT Monoid and should not behave like Monoid.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Function composition is Monoid but with Hack pipe, there is no such a concept anymore because it has broken the mathematics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With pipeline-operator in the algebraic sense,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;a |&amp;gt; f |&amp;gt; g   ===
a |&amp;gt; (f . g) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is Associative in Monad layer with Function composition that itself is Associative and Monoid/Monad in both layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type of Hack pipe
&lt;/h2&gt;

&lt;p&gt;I'll give it another shot.&lt;/p&gt;

&lt;p&gt;As a type,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;A |&amp;gt; F |&amp;gt; F |&amp;gt; F&lt;/code&gt;  is replaced to&lt;br&gt;
&lt;code&gt;A * F * F * F&lt;/code&gt;&lt;br&gt;
&lt;code&gt;===&lt;/code&gt;&lt;br&gt;
&lt;code&gt;A * (F + F + F)&lt;/code&gt;&lt;br&gt;
where&lt;br&gt;
&lt;code&gt;A * F&lt;/code&gt; is function application, and&lt;br&gt;
&lt;code&gt;F + F&lt;/code&gt; is function composition.&lt;/p&gt;

&lt;p&gt;Hack on the other hand,&lt;br&gt;
They claim the simplicity:&lt;br&gt;
&lt;code&gt;A * F * F * F&lt;/code&gt;&lt;br&gt;
&lt;code&gt;===&lt;/code&gt;&lt;br&gt;
&lt;code&gt;A * (F * F * F)&lt;/code&gt;&lt;br&gt;
We no longer understand what the &lt;code&gt;(F * F * F)&lt;/code&gt;  is.&lt;br&gt;
In fact, they say:&lt;br&gt;
&lt;code&gt;(F * F * F)&lt;/code&gt; itself is a syntax-error. &lt;br&gt;
Sure it should be because it doesn't make sense, and &lt;br&gt;
&lt;code&gt;(F * F * F)&lt;/code&gt; is refused to be evaluated because they ignore the rule of grouping-operator.&lt;br&gt;
&lt;strong&gt;In other words, they overrides a rule of the operator that has the highest precedence priority in JavaScript, that I would call hijack.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;(F * F * F)&lt;/code&gt;  is not a function composition like in F# or math pipe, nor anything understandable, so Type is &lt;code&gt;?&lt;/code&gt;&lt;br&gt;
&lt;code&gt;A * (?)&lt;/code&gt;&lt;br&gt;
and &lt;strong&gt;&lt;code&gt;(?)&lt;/code&gt; appears to be the evaluated value of the whole expression&lt;/strong&gt; (such as &lt;code&gt;3&lt;/code&gt;):&lt;br&gt;
&lt;code&gt;? == A * (?)&lt;/code&gt;&lt;br&gt;
therefore&lt;br&gt;
&lt;code&gt;A * (A * (A * (A * (A * (A * (A * (..?..)))))))&lt;/code&gt; &lt;br&gt;
Some structure of infinite recursion.&lt;br&gt;
That is the Type of the Hack pipe. Scary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hijacking grouping-operator &lt;code&gt;()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As you can see,&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134595674-9a280ced-0fb3-4c04-ac91-9fd84e483404.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F1316994%2F134595674-9a280ced-0fb3-4c04-ac91-9fd84e483404.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Internally, technically, the Hack &lt;code&gt;|&amp;gt;&lt;/code&gt; &lt;strong&gt;refuses&lt;/strong&gt; to evaluate &lt;code&gt;(f(%) |&amp;gt; g(%))&lt;/code&gt; first ignoring the rule of &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt;  &lt;code&gt;( )&lt;/code&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The grouping operator consists of a pair of parentheses around an expression or sub-expression to override the normal operator precedence so that &lt;strong&gt;expressions with lower precedence can be evaluated before an expression with higher priority.&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Grouping operator &lt;code&gt;( )&lt;/code&gt; itself has the highest &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence" rel="noopener noreferrer"&gt;Operator precedence&lt;/a&gt; in JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then I hear the counter explanation to justify Hack pipe anomaly:&lt;br&gt;
&lt;a href="https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926317660" rel="noopener noreferrer"&gt;https://github.com/tc39/proposal-pipeline-operator/issues/227#issuecomment-926317660&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s just the  &lt;em&gt;old&lt;/em&gt;  left-to-right evaluation rules. There aren’t any special grouping rules here. Parentheses change the grouping, but they  &lt;em&gt;never&lt;/em&gt;  have changed execution order from anything other than left to right.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"&lt;em&gt;old&lt;/em&gt; left-to-right evaluation rules" that means &lt;a href="https://en.wikipedia.org/wiki/Evaluation_strategy#Eager_evaluation" rel="noopener noreferrer"&gt;eager evaluation strategy&lt;/a&gt; of JavaScript follows the rule in the sense of both Mathematics and grouping-operator &lt;code&gt;()&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eager evaluation does not conflict to &lt;strong&gt;evaluation order&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The evaluation order arises from  &lt;a href="https://en.wikipedia.org/wiki/Dependency_graph" rel="noopener noreferrer"&gt;Dependency graph&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In mathematics, computer science and digital electronics, a dependency graph is a directed graph representing dependencies of several objects towards each other. It is possible to derive an &lt;strong&gt;evaluation order&lt;/strong&gt; or the absence of an &lt;strong&gt;evaluation order&lt;/strong&gt; that respects the given dependencies from the dependency graph.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and &lt;code&gt;()&lt;/code&gt; defines the dependency graph and the structure of the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember dependency graph or structure is completely different concept of time order.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here, in the terms of "&lt;strong&gt;evaluation order&lt;/strong&gt;", "&lt;strong&gt;before&lt;/strong&gt;", &lt;strong&gt;"after&lt;/strong&gt;" we discuss Not  &lt;strong&gt;time order of the evaluation/excision&lt;/strong&gt;, but &lt;strong&gt;dependency structure&lt;/strong&gt; of the code, which unfortunately it seems everyone in the Hack pipe proposal team share the confusion of the concept.&lt;br&gt;
 As we've seen, the Hack pipe refuses to follow the evaluation order of dependency structure and I would call this &lt;strong&gt;Hijacking grouping-operator &lt;code&gt;()&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I did explain to them, but they did not hear, then deleted my explanation. That is why I made a post here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tc39/proposal-pipeline-operator" rel="noopener noreferrer"&gt;Current TC39 proposal  Hack Pipeline Operator&lt;/a&gt; &lt;code&gt;|&amp;gt;&lt;/code&gt; has severe problems including the process of the staging, and the entire community of JavaScript will suffer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EDIT (2021/9/28):&lt;/strong&gt;&lt;br&gt;
Now they added a false statement to the MDN page of  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping" rel="noopener noreferrer"&gt;Grouping operator&lt;/a&gt; &lt;code&gt;( )&lt;/code&gt;, for the purpose of justifying their own proposal that is based on the confusion of the concept:  &lt;strong&gt;"evaluation order" derived from the dependency graph or structure is completely different concept of "time order" of executions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I made Issues:&lt;br&gt;
&lt;a href="https://github.com/mdn/content/issues/9306" rel="noopener noreferrer"&gt;Issue with "Grouping operator ( )": (invalid statements added) #9306&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mdn/content/issues/9317" rel="noopener noreferrer"&gt;Implicitly misleading into confusion of concepts: "Grouping operator ( )"  #9317&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mdn/content/pull/9325" rel="noopener noreferrer"&gt;Update Grouping operator ( )  #9325&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Please confirm here:&lt;br&gt;
&lt;a href="https://github.com/mdn/content/pull/9389" rel="noopener noreferrer"&gt;Description confusing concepts clarified  #9389&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The point of view here has been shared in &lt;a href="https://stackoverflow.com/questions/69384610/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haske/69386130" rel="noopener noreferrer"&gt;stack overflow question&lt;/a&gt; , and &lt;a href="https://stackoverflow.com/a/69386130/11316608" rel="noopener noreferrer"&gt;a third person confirmed the fact as the answer&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Grouping parentheses mean the same thing in Haskell as they do in high school mathematics. They group a sub-expression into a single term. This is also what they mean in Javascript and most other programming language,&lt;/p&gt;

&lt;p&gt;A language needs other rules beyond just the grouping of sub-expressions to pin down evaluation order (if it wants to specify the order), whether it's strict or lazy. So since you need other rules to determine it anyway, &lt;strong&gt;it is best (in my opinion) to think of evaluation order as a totally separate concept than grouping.&lt;/strong&gt; &lt;strong&gt;Mixing them up seems like a shortcut when you're learning high school mathematics, but it's just a handicap in more general settings.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Therefore, for the explanation of Grouping operator (parentheses) itself, the priority of the article should be to focus the functionality given as the meaning of  "high school mathematics".&lt;/p&gt;

&lt;p&gt;The wording of old version "operands" of "preserved" actively misleads readers to confuse the  "high school mathematics" principle of the Grouping operator and the evaluation strategy of JavaScript runtime. &lt;/p&gt;

&lt;p&gt;If anyone think such an example is required and to be included in this page, they need to explain thoroughly for readers to avoid the confusion of concepts between the mathematical aspect and evaluation strategy that the latter is essentially off-topic here.&lt;/p&gt;




&lt;p&gt;Also, my next article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/stken2050/does-the-functionality-of-grouping-operator-in-javascript-differ-from-haskell-or-other-programming-languages-1f20"&gt;Does the functionality of Grouping operator () in JavaScript differ from Haskell or other programming languages?&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>tc39</category>
      <category>functional</category>
    </item>
  </channel>
</rss>
