<?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: Rich Ramalho</title>
    <description>The latest articles on DEV Community by Rich Ramalho (@richecr).</description>
    <link>https://dev.to/richecr</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%2F175119%2Fe77c8a5a-d41d-42aa-9206-dd5dd7c08080.jpeg</url>
      <title>DEV Community: Rich Ramalho</title>
      <link>https://dev.to/richecr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/richecr"/>
    <language>en</language>
    <item>
      <title>Apresentando holo-fn: uma biblioteca funcional mínima para TypeScript</title>
      <dc:creator>Rich Ramalho</dc:creator>
      <pubDate>Sun, 04 May 2025 00:30:00 +0000</pubDate>
      <link>https://dev.to/richecr/apresentando-holo-fn-uma-biblioteca-funcional-minima-para-typescript-bm7</link>
      <guid>https://dev.to/richecr/apresentando-holo-fn-uma-biblioteca-funcional-minima-para-typescript-bm7</guid>
      <description>&lt;p&gt;The English version of this post is &lt;a href="https://dev.to/richecr/introducing-holo-fn-a-minimal-functional-library-for-typescript-cob"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Você é um desenvolvedor TypeScript que adora programação funcional? Então, eu tenho algo para você: &lt;strong&gt;holo-fn&lt;/strong&gt; – uma biblioteca funcional e leve projetada para lidar com valores opcionais, erros e resultados de uma forma simples, segura em tipos e imutável.&lt;/p&gt;

&lt;p&gt;O nome &lt;strong&gt;holo-fn&lt;/strong&gt; é inspirado pelo &lt;strong&gt;Holocron&lt;/strong&gt; do universo &lt;strong&gt;Star Wars&lt;/strong&gt;. Um Holocron é um dispositivo usado para armazenar grandes quantidades de conhecimento, passadas ao longo das gerações. Da mesma forma, o holo-fn serve como um repositório para poderosos construtos de programação funcional (como &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt; e &lt;code&gt;Result&lt;/code&gt;), projetados para tornar seu código TypeScript mais limpo, seguro e componível.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Por que usar o holo-fn?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;holo-fn&lt;/strong&gt; fornece poderosas monads como &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt; e &lt;code&gt;Result&lt;/code&gt;. Esses construtos funcionais ajudam você a escrever um código mais seguro, limpo e componível, lidando com casos como valores ausentes, erros e resultados de maneira mais previsível e gerenciável.&lt;/p&gt;

&lt;p&gt;Ele foi desenvolvido para funcionar perfeitamente com a função &lt;code&gt;pipe&lt;/code&gt; do &lt;strong&gt;Rambda&lt;/strong&gt; para um estilo ainda mais funcional.&lt;/p&gt;

&lt;p&gt;It is built to work seamlessly with the &lt;code&gt;pipe&lt;/code&gt; function from Rambda for an even more functional style.&lt;/p&gt;

&lt;h3&gt;
  
  
  Principais Funcionalidades:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tipos funcionais:&lt;/strong&gt; Maybe, Either e Result para lidar com valores opcionais, erros e resultados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imutabilidade:&lt;/strong&gt; Tudo é imutável por padrão, tornando seu código mais previsível e seguro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Segurança de Tipo:&lt;/strong&gt; Totalmente tipado com TypeScript, para que você possa confiar na análise estática do TypeScript.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cobertura de Testes 100%:&lt;/strong&gt; Rigorosamente testado com 100% de cobertura, garantindo estabilidade e confiabilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sem dependências:&lt;/strong&gt; Zero dependências, mantendo seu projeto leve.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatibilidade com Rambda:&lt;/strong&gt; Criado para funcionar perfeitamente com a função pipe do Rambda.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Instalação
&lt;/h2&gt;

&lt;p&gt;Você pode instalar facilmente o &lt;a href="https://www.npmjs.com/package/holo-fn" rel="noopener noreferrer"&gt;holo-fn&lt;/a&gt; via npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;holo-fn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Começando
&lt;/h2&gt;

&lt;p&gt;Aqui está um exemplo rápido de como começar com o &lt;strong&gt;holo-fn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://richecr.github.io/holo-fn/getting_started/" rel="noopener noreferrer"&gt;https://richecr.github.io/holo-fn/getting_started/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Maybe
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Maybe&lt;/code&gt; é usado para lidar com valores que podem ser nulos ou indefinidos. Ele previne erros de null/undefined ao envolver os valores em &lt;code&gt;Just&lt;/code&gt; (para valores presentes) ou &lt;code&gt;Nothing&lt;/code&gt; (para valores ausentes).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fromNullable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/maybe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fromNullable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rich&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// RICH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode ver os métodos que o Maybe suporta &lt;a href="https://richecr.github.io/holo-fn/maybe/" rel="noopener noreferrer"&gt;nesta página&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Either
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Either&lt;/code&gt; representa uma computação que pode ter sucesso (&lt;code&gt;Right&lt;/code&gt;) ou falhar (&lt;code&gt;Left&lt;/code&gt;). Isso é especialmente útil para tratamento de erros, onde o lado esquerdo representa um erro e o lado direito representa um sucesso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Right&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/either&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode ver os métodos que o Either suporta &lt;a href="https://richecr.github.io/holo-fn/either/" rel="noopener noreferrer"&gt;nesta página&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Result&lt;/code&gt; é semelhante ao &lt;code&gt;Either&lt;/code&gt;, mas especificamente projetado para operações que podem ter sucesso com um valor (&lt;code&gt;Ok&lt;/code&gt;) ou falhar com um erro (&lt;code&gt;Err&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Ok&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode ver os métodos que o Result suporta &lt;a href="https://richecr.github.io/holo-fn/result/" rel="noopener noreferrer"&gt;nesta página&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Funções Curried
&lt;/h2&gt;

&lt;p&gt;Para um estilo mais funcional, &lt;strong&gt;holo-fn&lt;/strong&gt; também oferece versões curried da maioria dos métodos. Você pode facilmente compondo-os usando o &lt;code&gt;pipe&lt;/code&gt; do &lt;strong&gt;Rambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Exemplos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapErrR&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;mapErrR&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Mapped error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "No value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapLeftE&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/either&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;mapLeftE&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Mapped error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "No value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos a documentação para essas funções para cada tipo que você deseja usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/maybe/#curried-helpers" rel="noopener noreferrer"&gt;Funções Curried para Maybe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/either/#curried-helpers" rel="noopener noreferrer"&gt;Funções Curried para Either&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/result/#curried-helpers" rel="noopener noreferrer"&gt;Funções Curried para Result&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Por que escolher o holo-fn?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Imutabilidade:&lt;/strong&gt; Todos os valores são imutáveis por padrão. Isso reduz erros e torna o código mais fácil de entender.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Composição:&lt;/strong&gt; Use &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;chain&lt;/code&gt;, e &lt;code&gt;unwrapOr&lt;/code&gt; para fácil composição de pipelines funcionais.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Segurança de Tipo:&lt;/strong&gt; holo-fn é totalmente tipado com TypeScript, garantindo que seu código seja seguro, sem surpresas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leve:&lt;/strong&gt; Foi projetado para ser leve, com zero dependências.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compatível com Rambda:&lt;/strong&gt; Funciona muito bem com o &lt;code&gt;pipe&lt;/code&gt; do &lt;strong&gt;Rambda&lt;/strong&gt;, permitindo padrões de programação funcional.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📈 Considerações de Performance
&lt;/h2&gt;

&lt;p&gt;Como o &lt;strong&gt;holo-fn&lt;/strong&gt; foi projetado para ser componível e seguro em tipos, também garante que o desempenho não seja comprometido. Os métodos da biblioteca são otimizados para execução rápida e eficiente, com sobrecarga mínima.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Contribua
&lt;/h2&gt;

&lt;p&gt;Quer contribuir? Estamos abertos a contribuições! Se você tem familiaridade com TypeScript e programação funcional, fique à vontade para enviar problemas ou pull requests para melhorar a biblioteca.&lt;/p&gt;

&lt;p&gt;Você pode começar fazendo um fork do repositório e fazendo suas alterações. Depois disso, basta enviar um pull request!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://richecr.github.io/holo-fn/contributing/" rel="noopener noreferrer"&gt;Aqui&lt;/a&gt; temos uma página dedicada para novos contribuidores e fique a vontade para abrir uma issue de dúvida.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/richecr/holo-fn" rel="noopener noreferrer"&gt;Repositório do GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/holo-fn" rel="noopener noreferrer"&gt;Página no npm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;holo-fn&lt;/strong&gt; é uma biblioteca minimalista, mas poderosa, que torna a programação funcional em TypeScript mais acessível. Com suporte a monads como &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt; e &lt;code&gt;Result&lt;/code&gt;, você pode facilmente lidar com casos de borda de forma previsível e limpa. Comece a usá-la em seus projetos TypeScript e aproveite os benefícios da programação funcional!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>functional</category>
      <category>opensource</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introducing holo-fn: A Minimal Functional Library for TypeScript</title>
      <dc:creator>Rich Ramalho</dc:creator>
      <pubDate>Sun, 04 May 2025 00:29:25 +0000</pubDate>
      <link>https://dev.to/richecr/introducing-holo-fn-a-minimal-functional-library-for-typescript-cob</link>
      <guid>https://dev.to/richecr/introducing-holo-fn-a-minimal-functional-library-for-typescript-cob</guid>
      <description>&lt;h2&gt;
  
  
  Introdution
&lt;/h2&gt;

&lt;p&gt;Are you a TypeScript developer who loves functional programming? Well, I’ve got something for you: &lt;strong&gt;holo-fn&lt;/strong&gt; – a lightweight, functional library designed to handle optional values, errors, and results in a simple, type-safe, and immutable way.&lt;/p&gt;

&lt;p&gt;The name &lt;strong&gt;holo-fn&lt;/strong&gt; is inspired by &lt;strong&gt;Holocron&lt;/strong&gt; from the &lt;strong&gt;Star Wars&lt;/strong&gt; universe. A Holocron is a device used to store vast amounts of knowledge, passed down through the ages. Similarly, holo-fn serves as a repository for powerful, functional programming constructs (like Maybe, Either, and Result), designed to make your TypeScript code cleaner, safer, and more composable.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why holo-fn?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;holo-fn&lt;/strong&gt; provides powerful monads like &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt;, and &lt;code&gt;Result&lt;/code&gt;. These functional constructs help you write safer, cleaner, and more composable code by handling edge cases like missing values, errors, and successful outcomes in a more predictable and manageable way.&lt;/p&gt;

&lt;p&gt;It is built to work seamlessly with the &lt;code&gt;pipe&lt;/code&gt; function from Rambda for an even more functional style.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Functional types:&lt;/strong&gt; &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt;, and &lt;code&gt;Result&lt;/code&gt; to handle optional values, errors, and results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immutability:&lt;/strong&gt; Everything is immutable by default, making your code more predictable and safer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Type Safety:&lt;/strong&gt; Fully typed with TypeScript, so you can rely on the power of TypeScript’s static analysis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;100% Test Coverage:&lt;/strong&gt; Rigorously tested with 100% coverage, ensuring stability and reliability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No dependencies:&lt;/strong&gt; Zero dependencies, keeping your project lightweight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rambda compatibility:&lt;/strong&gt; Built to seamlessly work with pipe from Rambda.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Installation
&lt;/h2&gt;

&lt;p&gt;You can easily install &lt;a href="https://www.npmjs.com/package/holo-fn" rel="noopener noreferrer"&gt;holo-fn&lt;/a&gt; via npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;holo-fn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;p&gt;Here’s a quick example of how to get started with &lt;strong&gt;holo-fn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://richecr.github.io/holo-fn/getting_started/" rel="noopener noreferrer"&gt;https://richecr.github.io/holo-fn/getting_started/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Maybe
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Maybe&lt;/code&gt; is used to handle values that can be null or undefined. It prevents null/undefined errors by wrapping values in a &lt;code&gt;Just&lt;/code&gt; (for present values) or &lt;code&gt;Nothing&lt;/code&gt; (for absent values).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fromNullable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/maybe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fromNullable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rich&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Anonymous&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// RICH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see the methods that maybe supports on &lt;a href="https://richecr.github.io/holo-fn/maybe/" rel="noopener noreferrer"&gt;this page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Either
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Either&lt;/code&gt; represents a computation that can either succeed (&lt;code&gt;Right&lt;/code&gt;) or fail (&lt;code&gt;Left&lt;/code&gt;). This is especially useful for error handling, where the left side represents an error and the right side represents a success.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Right&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/either&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see the methods that either supports on &lt;a href="https://richecr.github.io/holo-fn/either/" rel="noopener noreferrer"&gt;this page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Result&lt;/code&gt; is similar to &lt;code&gt;Either&lt;/code&gt;, but specifically designed for operations that can either succeed with a value (&lt;code&gt;Ok&lt;/code&gt;) or fail with an error (&lt;code&gt;Err&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Ok&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Ok&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see the methods that result supports on &lt;a href="https://richecr.github.io/holo-fn/result/" rel="noopener noreferrer"&gt;this page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Curried Functions
&lt;/h2&gt;

&lt;p&gt;For a more functional approach, &lt;strong&gt;holo-fn&lt;/strong&gt; also provides curried versions of most methods. You can easily compose them using &lt;code&gt;pipe&lt;/code&gt; from &lt;strong&gt;Rambda&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapErrR&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/result&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;mapErrR&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Mapped error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "No value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mapLeftE&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;holo-fn/either&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;mapLeftE&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`Mapped error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unwrapOr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No value&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "No value"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have documentation for these functions for each type you want to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/maybe/#curried-helpers" rel="noopener noreferrer"&gt;Maybe Curried Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/either/#curried-helpers" rel="noopener noreferrer"&gt;Either Curried Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://richecr.github.io/holo-fn/result/#curried-helpers" rel="noopener noreferrer"&gt;Result Curried Functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Why Choose holo-fn?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immutability:&lt;/strong&gt; All values are immutable by default. This reduces bugs and makes code easier to reason about.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Composability:&lt;/strong&gt; Use &lt;code&gt;map&lt;/code&gt;, &lt;code&gt;chain&lt;/code&gt;, and &lt;code&gt;unwrapOr&lt;/code&gt; for easy composition of functional pipelines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Type Safety:&lt;/strong&gt; holo-fn is fully typed with TypeScript, making sure your code is safe, with no surprises.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lightweight:&lt;/strong&gt; It’s designed to be lightweight, with zero dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rambda-Friendly:&lt;/strong&gt; Works beautifully with pipe from Rambda, enabling functional programming patterns.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📈 Performance Considerations
&lt;/h2&gt;

&lt;p&gt;Since &lt;strong&gt;holo-fn&lt;/strong&gt; is built for composability and type safety, it also ensures that performance isn’t compromised. The library’s methods are optimized for fast and efficient execution, with minimal overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Contribute
&lt;/h2&gt;

&lt;p&gt;Want to contribute? We’re open to contributions! If you’re familiar with TypeScript and functional programming, feel free to submit issues or pull requests to improve the library.&lt;/p&gt;

&lt;p&gt;You can start by forking the repository and making your changes. Once done, simply submit a pull request!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://richecr.github.io/holo-fn/contributing/" rel="noopener noreferrer"&gt;Here&lt;/a&gt; we have a dedicated page for new contributors and feel free to open an issue with any questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/richecr/holo-fn" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/holo-fn" rel="noopener noreferrer"&gt;npm Page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;holo-fn&lt;/strong&gt; is a minimal yet powerful library that makes functional programming in TypeScript more approachable. With support for monads like &lt;code&gt;Maybe&lt;/code&gt;, &lt;code&gt;Either&lt;/code&gt;, and &lt;code&gt;Result&lt;/code&gt;, you can easily handle edge cases in a predictable and clean way. Start using it in your TypeScript projects and enjoy the benefits of functional programming!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>typescript</category>
      <category>functional</category>
    </item>
  </channel>
</rss>
