<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rust on Inanna Malick</title>
    <link>https://recursion.wtf/tags/rust/</link>
    <description>Recent content in Rust on Inanna Malick</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 12 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://recursion.wtf/tags/rust/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ExoMonad</title>
      <link>https://recursion.wtf/posts/exomonad/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/exomonad/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/tidepool-heavy-industries/exomonad&#34;&gt;ExoMonad&lt;/a&gt; builds on &lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34;&gt;Gastown&amp;rsquo;s worktree model&lt;/a&gt;, replacing &amp;ldquo;swarm of agents ramming PRs into main&amp;rdquo; with a tree of worktrees. It hooks into Claude Agent Teams&amp;rsquo; messaging bus, so agents running other model architectures show up as native team members. It integrates with Copilot for Github PR reviews. It stitches together Claude, Gemini, Kimi, Letta Code, Copilot — using their existing binaries and your existing subscription plan.&lt;/p&gt;&#xA;&lt;p&gt;ExoMonad is radically reconfigurable. It ships with a default devswarm configuration that handles worktrees, coordination, iterating on pull requests, but &lt;a href=&#34;https://recursion.wtf/posts/vibe_coding_critical_infrastructure/&#34;&gt;when I needed a red team test harness&lt;/a&gt;, I just wrote another exomonad config, and threw one together overnight &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I started by using ExoMonad to build itself over 700 PRs. A few weeks ago, it felt ready to test out on other projects, so I used it to implement a new Haskell compiler backend using Rust.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tidepool</title>
      <link>https://recursion.wtf/posts/tidepool/</link>
      <pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/tidepool/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/tidepool-heavy-industries/tidepool&#34;&gt;Tidepool&lt;/a&gt; is a lazily evaluated Haskell-in-Rust runtime with native interop. It&amp;rsquo;s very similar to the WASM sandbox used by &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad&lt;/a&gt;, except instead of WebAssembly it uses Rust&amp;rsquo;s Cranelift JIT crate directly, operating on the intermediate representation Core used by the Haskell compiler.&lt;/p&gt;&#xA;&lt;p&gt;I built Tidepool using &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad&lt;/a&gt; over about two weeks, using less than 50% of my Claude Max and Gemini Ultra subscription plans. For the build story — how an agent swarm blasted out 32,000 lines across 61 PRs in 4 days — see the &lt;a href=&#34;https://recursion.wtf/posts/exomonad/&#34;&gt;ExoMonad post&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Detect: a readable alternative to find/exec/grep</title>
      <link>https://recursion.wtf/posts/detect/</link>
      <pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/detect/</guid>
      <description>&lt;h1 id=&#34;detect&#34;&gt;Detect&lt;/h1&gt;&#xA;&lt;p&gt;I built &lt;a href=&#34;https://crates.io/crates/detect&#34;&gt;detect&lt;/a&gt; because I was tired of looking up &lt;code&gt;find&lt;/code&gt;/&lt;code&gt;grep&lt;/code&gt;/&lt;code&gt;xargs&lt;/code&gt; syntax on Stack Overflow every time I needed to search my filesystem in any nontrivial way. It&amp;rsquo;s a Rust tool that uses a concise and readable expression language to build queries that output matching file paths.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;d like to follow along, run &lt;code&gt;cargo install detect&lt;/code&gt; and try it yourself. You&amp;rsquo;ll need the Rust toolchain, which you can install using &lt;a href=&#34;https://rustup.rs/&#34;&gt;rustup&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Here are some examples:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:2;-o-tab-size:2;tab-size:2;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# every rust file modified in the last week that imports tokio _and_ serde (mean time: 179ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext == rs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use tokio&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; content contains &amp;#34;use serde&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;        &amp;amp;&amp;amp; modified &amp;gt; -7d&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cargo.toml files with package edition 2018 (mean time: 42ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;name == &amp;#34;Cargo.toml&amp;#34; &amp;amp;&amp;amp; toml:.package.edition == 2018&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# non-image files with size over 0.5MB (mean time: 303ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;size &amp;gt; 0.5mb &amp;amp;&amp;amp; !ext in [png, jpeg, jpg]&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# frontend code referencing JIRA tickets (mean time: 43ms)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;detect &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ext in [ts, js, css] &amp;amp;&amp;amp; content ~= JIRA-[0-9]+&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Recursion: a quick introduction</title>
      <link>https://recursion.wtf/posts/recursion_lib_intro/</link>
      <pubDate>Mon, 16 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/recursion_lib_intro/</guid>
      <description>&lt;p&gt;In traditional low level languages such as C iteration is implemented manually, with users writing out &lt;code class=&#34;code-inline language-c&#34;&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; idx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; idx &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; items_len; &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;idx) { &lt;span style=&#34;color:#a6e22e&#34;&gt;do_thing&lt;/span&gt;(items[idx] } &#xA;&lt;/code&gt;, every time they want to iterate over a list. Newer languages like Rust provide abstractions - iterators - that separate the &lt;em&gt;machinery&lt;/em&gt; of recursion from the logic: &lt;code class=&#34;code-inline language-rust&#34;&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; item &lt;span style=&#34;color:#66d9ef&#34;&gt;in&lt;/span&gt; items.iter() { do_thing(item) }&lt;/code&gt; .&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://crates.io/crates/recursion&#34;&gt;recursion crate&lt;/a&gt; does the same thing for recursive data structures. This post is an introduction to the new version of the &lt;code&gt;recursion&lt;/code&gt; crate, but you don&amp;rsquo;t have to read &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes/&#34;&gt;my&lt;/a&gt; &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_2/&#34;&gt;earlier&lt;/a&gt; &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_3/&#34;&gt;posts&lt;/a&gt; to understand it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Single Pass Recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes_3/</link>
      <pubDate>Wed, 05 Oct 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes_3/</guid>
      <description>&lt;p&gt;This is the third post in a three-post series. In the &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes&#34;&gt;first post&lt;/a&gt; we developed a stack-safe, ergonomic, and concise method for working with recursive data structures (using a simple expression language as an example). In the &lt;a href=&#34;https://recursion.wtf/posts/rust_schemes_2&#34;&gt;second post&lt;/a&gt; we made it fully generic, providing a set of generic tools for expanding and collapsing &lt;em&gt;any&lt;/em&gt; recursive data structure in Rust.&lt;/p&gt;&#xA;&lt;p&gt;In this post we will see how to &lt;em&gt;combine&lt;/em&gt; these two things - expanding a structure and collapsing it at the same time, performing both operations in a single pass. In the process, we will gain the ability to write arbitrary recursive functions over traditional boxed-pointer recursive structures (instead of the novel &lt;code&gt;RecursiveTree&lt;/code&gt; type introduced in my previous post) while retaining stack safety.&lt;/p&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://recursion.wtf/css/hugo-easy-gallery.css&#34; /&gt;&#xA;&lt;div class=&#34;box&#34; &gt;&#xA;  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;    &lt;div class=&#34;img&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://recursion.wtf/img/rust_schemes/stack_machines_1/simple_expr_eval.gif&#34; alt=&#34;execution graph for simultaneously expanding and collapsing a simple expression&#34;/&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;a href=&#34;https://recursion.wtf/img/rust_schemes/stack_machines_1/simple_expr_eval.gif&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Fully generic recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes_2/</link>
      <pubDate>Thu, 28 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes_2/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://recursion.wtf/posts/rust_schemes/&#34;&gt;Previously&lt;/a&gt;, we introduced a method for writing performant stack safe recursion in Rust for a single recursive data structure. This post uses the same ideas to implement a &lt;em&gt;single&lt;/em&gt; recursion backend that can collapse or expand any recursive data structure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Elegant and performant recursion in Rust</title>
      <link>https://recursion.wtf/posts/rust_schemes/</link>
      <pubDate>Mon, 18 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/rust_schemes/</guid>
      <description>&lt;p&gt;This is a post about writing elegant and performant recursive algorithms in Rust. It makes heavy use of a pattern from Haskell called recursion schemes, but you don&amp;rsquo;t need to know anything about that; it&amp;rsquo;s just an implementation detail. Instead, as motivation, I have benchmarks showing a 14-34% improvement over the typical boxed pointer representation of recursive data structures in Rust.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Transitive Frontier</title>
      <link>https://recursion.wtf/posts/transitive-frontier/</link>
      <pubDate>Wed, 30 Dec 2020 00:00:00 +0000</pubDate>
      <guid>https://recursion.wtf/posts/transitive-frontier/</guid>
      <description>&lt;h2 id=&#34;querying-cargo-dependency-dags-with-guppy&#34;&gt;Querying Cargo Dependency DAGs with Guppy&lt;/h2&gt;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://recursion.wtf/css/hugo-easy-gallery.css&#34; /&gt;&#xA;&lt;div class=&#34;box&#34; &gt;&#xA;  &lt;figure  itemprop=&#34;associatedMedia&#34; itemscope itemtype=&#34;http://schema.org/ImageObject&#34;&gt;&#xA;    &lt;div class=&#34;img&#34;&gt;&#xA;      &lt;img itemprop=&#34;thumbnail&#34; src=&#34;https://recursion.wtf/img/transitive_frontier/project_with_compat_transitive_frontier.svg&#34; alt=&#34;dependency graph&#34;/&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;a href=&#34;https://recursion.wtf/img/transitive_frontier/project_with_compat_transitive_frontier.svg&#34; itemprop=&#34;contentUrl&#34;&gt;&lt;/a&gt;&#xA;  &lt;/figure&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;&lt;a href=&#34;https://crates.io/crates/guppy&#34;&gt;&lt;code&gt;guppy&lt;/code&gt;&lt;/a&gt; is a rust crate that provides tools for working with cargo dependency graphs using the &lt;a href=&#34;https://crates.io/crates/petgraph&#34;&gt;&lt;code&gt;petgraph&lt;/code&gt;&lt;/a&gt; graph data structure crate. It&amp;rsquo;s used by Facebook to audit a high-security subset of the cargo dependency graph for some of their more high-visibility projects. Treating the dependency graph resulting from a cargo build operation as a DAG lets us draw on the well-studied field of graph algorithms to answer complex questions about our build without resorting to ad-hoc traversals or re-implementation of common graph primitives.&lt;/p&gt;&#xA;&lt;p&gt;For my first project using &lt;code&gt;guppy&lt;/code&gt;, I decided to build a tool to produce machine-readable summaries describing why some target dependency is included in a cargo workspace&amp;rsquo;s build graph. My motivation was to support projects that are migrating from &lt;code&gt;futures 0.1&lt;/code&gt; to &lt;code&gt;futures 0.3&lt;/code&gt;. Many rust projects started using &lt;code&gt;futures 0.1&lt;/code&gt; for their initial async implementation, and are still in the process of switching over to &lt;code&gt;futures 0.3&lt;/code&gt;. If you&amp;rsquo;re interested in learning more about the differences between the two packages, &lt;a href=&#34;https://www.ncameron.org/blog/migrating-a-crate-from-futures-0-1-to-0-3/&#34;&gt;this blog post by ncameron&lt;/a&gt; is a great resource. Being able to easily generate machine-readable reports opens up new possibilities - for example, you could use the output of this tool to build a linter that asserts that no new transitive dependencies on &lt;code&gt;futures 0.1&lt;/code&gt; are introduced into a workspace, to provide tooling-backed assurances that usage of &lt;code&gt;futures 0.1&lt;/code&gt; only ever decreases.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
