+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <title>pipes</title>
+ <link rel="icon" type="image/x-icon" href="https://taranathan.com/favicon.ico">
+ <link rel="stylesheet" href="https://taranathan.com/styles.css">
+</head>
+
+<body>
+ <div class="container">
+ <div class="kaomoji-sidebar kaomoji-left">
+ <div class="scroll-text" id="kaomoji-left"></div>
+ </div>
+
+ <main class="content">
+ <header class="header">
+ <h1 href="/">My Blog</h1>
+ <nav class="nav">
+ <a href="/">Home</a>
+ <a href="/blog">Blog</a>
+ <a href="/miniblog">Miniblog</a>
+ <a href="/boo" target="_blank">Fun</a>
+ </nav>
+ </header>
+
+ <section class="content-body">
+
+ <article class="post">
+ <h1 class="title">pipes</h1>
+ <p class="subtitle"><strong>2026-06-22</strong></p>
+ <div class="post-content"><p>Huh. I was just thinking about how cool a pipe operator would be in rust, and about method-chaining when I realized that they are both kind of the same thing! For example, look at these rust and gleam (a language with a very similar syntax):</p>
+<pre class="giallo" style="color: #CDD6F4; background-color: #1E1E2E;" ><code data-lang="rust"><span class="giallo-l"><span style="color: #9399B2;font-style: italic;">//rust</span></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span> result</span><span style="color: #94E2D5;">:</span><span style="color: #F9E2AF;font-style: italic;"> Result</span><span style="color: #89DCEB;"><</span><span style="color: #CBA6F7;">i32</span><span style="color: #89DCEB;">></span><span style="color: #94E2D5;"> =</span><span style="color: #89B4FA;font-style: italic;"> fallible_operation</span><span style="color: #9399B2;">();</span></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span> output</span><span style="color: #94E2D5;"> =</span><span> result</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> .</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span><span>add_one</span><span style="color: #9399B2;">)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> .</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span><span>add_one</span><span style="color: #9399B2;">)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> .</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span><span>add_one</span><span style="color: #9399B2;">)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> .</span><span style="color: #89B4FA;font-style: italic;">unwrap_or</span><span style="color: #9399B2;">(</span><span style="color: #FAB387;">0</span><span style="color: #9399B2;">);</span></span></code></pre><br>
+<pre class="giallo" style="color: #CDD6F4; background-color: #1E1E2E;" ><code data-lang="gleam"><span class="giallo-l"><span style="color: #9399B2;font-style: italic;">//gleam</span></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span style="color: #EBA0AC;font-style: italic;"> result: </span><span style="color: #F9E2AF;font-style: italic;">Result</span><span>(</span><span style="color: #F9E2AF;font-style: italic;">Int</span><span>) </span><span style="color: #94E2D5;">=</span><span style="color: #89B4FA;font-style: italic;"> fallible_operation</span><span>()</span></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span> output </span><span style="color: #94E2D5;">=</span><span> result</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> |></span><span> result.</span><span style="color: #89B4FA;font-style: italic;">map</span><span>(add_one)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> |></span><span> result.</span><span style="color: #89B4FA;font-style: italic;">map</span><span>(add_one)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> |></span><span> result.</span><span style="color: #89B4FA;font-style: italic;">map</span><span>(add_one)</span></span>
+<span class="giallo-l"><span style="color: #94E2D5;"> |></span><span> result.</span><span style="color: #89B4FA;font-style: italic;">unwrap</span><span>(</span><span style="color: #FAB387;">0</span><span>)</span></span></code></pre>
+<p>When they are formatted this way, don’t they look <em>pretttty</em> similar? That’s because, they are, by definition, the exact same thing. If you look into the function signatures behind any <code>impl</code> method/function in rust, they all start with an <code>&self</code> or some variation because the dot notation is actually just syntax sugar. If I wanted to write out the rust example the long way, I could’ve done it like this:</p>
+<pre class="giallo" style="color: #CDD6F4; background-color: #1E1E2E;" ><code data-lang="rust"><span class="giallo-l"><span style="color: #9399B2;font-style: italic;">// the type of std::result::unwrap_or is fn(self, F) -> Result<U, E>,</span></span>
+<span class="giallo-l"><span style="color: #9399B2;font-style: italic;">// but in dot notation the first argument is omitted, like in a pipe operator</span></span>
+<span class="giallo-l"></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span> result</span><span style="color: #94E2D5;">:</span><span style="color: #F9E2AF;font-style: italic;"> Result</span><span style="color: #89DCEB;"><</span><span style="color: #CBA6F7;">i32</span><span style="color: #89DCEB;">></span><span style="color: #94E2D5;"> =</span><span style="color: #89B4FA;font-style: italic;"> fallible_operation</span><span style="color: #9399B2;">();</span></span>
+<span class="giallo-l"><span style="color: #CBA6F7;">let</span><span> output</span><span style="color: #94E2D5;"> =</span><span style="color: #F9E2AF;"> std</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">result</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;font-style: italic;">Result</span><span style="color: #94E2D5;">::</span><span style="color: #89B4FA;font-style: italic;">unwrap_or</span><span style="color: #9399B2;">(</span></span>
+<span class="giallo-l"><span style="color: #F9E2AF;"> std</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">result</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">Result</span><span style="color: #94E2D5;">::</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span></span>
+<span class="giallo-l"><span style="color: #F9E2AF;"> std</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">result</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">Result</span><span style="color: #94E2D5;">::</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span></span>
+<span class="giallo-l"><span style="color: #F9E2AF;"> std</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">result</span><span style="color: #94E2D5;">::</span><span style="color: #F9E2AF;">Result</span><span style="color: #94E2D5;">::</span><span style="color: #89B4FA;font-style: italic;">map</span><span style="color: #9399B2;">(</span><span style="color: #94E2D5;">&</span><span>result</span><span style="color: #9399B2;">,</span><span> add_one</span><span style="color: #9399B2;">),</span><span> add_one</span><span style="color: #9399B2;">),</span><span> add_one</span><span style="color: #9399B2;">),</span></span>
+<span class="giallo-l"><span style="color: #FAB387;"> 0</span><span style="color: #9399B2;">);</span></span></code></pre>
+<p>And the pipe operator in so many functional languages also serves the same purpose: as syntax sugar. Anyways, I just found this kind of neat, and my guess as to a little bit about why there isn’t a pipe operator in rust yet, despite taking so much heavy influence from functional languages like OCaml.</p>
+</div>
+ </article>
+
+ </section>
+ </main>
+
+ <div class="kaomoji-sidebar kaomoji-right">
+ <div class="scroll-text" id="kaomoji-right"></div>
+ </div>
+ </div>
+
+ <script>
+ // Smooth scrolling for internal links
+ document.querySelectorAll('nav a').forEach(anchor => {
+ anchor.addEventListener('click', function (e) {
+ const href = this.getAttribute('href');
+ if (href && href.startsWith('#')) {
+ e.preventDefault();
+ document.querySelector(href).scrollIntoView({ behavior: 'smooth' });
+ }
+ });
+ });
+
+ // Fetch kaomoji text if available
+ fetch('https://taranathan.com/kaomoji.txt').then(r => { if (r.ok) return r.text(); }).then(data => {
+ if (data) {
+ const l = document.getElementById('kaomoji-left');
+ const rgt = document.getElementById('kaomoji-right');
+ if (l) l.textContent = data;
+ if (rgt) rgt.textContent = data;
+ }
+ }).catch(()=>{});
+ </script>
+</body>
+
+</html>