Awesome FP JS 
This is a curated list of awesome functional
programming code and learning resources for JavaScript. As a
multi-paradigm programming language, JavaScript can be written in many
styles. With these resources we want to help you to make better use of
JavaScript’s support for writing programs in a functional
way.
Functional programming is a style of
programming which models computations as the evaluation of
expressions. Contrast this with imperative programming where programs
are composed of statements which change global state when executed.
Functional programming typically avoids using mutable state and favors
side-effect free functions and immutable data instead.
This encourages writing composable and declarative programs that are
easy to reason about.
Table of Contents
These may be appended to entries. Each should be preceded by a “+” or
“-” to indicate presence or absence of the tag’s meaning. “-” tags
should only be included when they are likely to help someone filter
libraries for their needs. For instance, -TS tags are
probably useful for Typescript users screening for types, but
-CT tags would be less likely to be helpful to anyone.
- CT. Category Theory. This library appears to be
inspired by Haskell, Scala, or another functional language’s library
with a grounding in Category Theory.
- TS. Typescript. This library has typescript
types.
Libraries
- Ramda – A practical
functional library for JavaScript that is designed specifically for a
functional programming style. A style that makes it easy to create
functional pipelines and never mutates user data. +TS.
- Ramda Adjunct
is a community-maintained extension of Ramda.
- Ramda-extension is
set of utility point-free functions composed only from Ramda
functions.
- Rambda - A
faster alternative to Ramda in under 10kB.
- Rambdax -
Extended version of Rambda
- Folktale – A
standard library for functional programming in JavaScript. Typescript
support expected mid-2020. -TS.
- lodash/fp – An
instance of Lodash with
its methods wrapped to produce immutable, auto-curried, iteratee-first,
data-last methods. +TS.
- functional.js –
A lightweight functional JavaScript library that facilitates currying
and point-free / tacit programming.
- 101 – A modern and
modular JavaScript utility library made to work well with vanilla
JavaScript methods. -TS
- fnuc – A functional
library for CoffeeScript (and JavaScript) to facilitate functional
composition and higher order functions.
- barely-functional
– A tiny (2.7kb) functional programming library using native ES5/6
operations. -TS.
- bluebird-promisell
- A practical functional programming library for promises.
- prelude.ls – A
functionally oriented utility library somewhat based off of Haskell’s
Prelude module. -TS.
- preludejs -
Hardcore Functional Programming for JavaScript. -TS.
- 1-liners –
Functional tools that couldn’t be simpler. A dead simple functional
utility belt, hand-crafted with love and attention. -TS.
- fn-curry – A
simple function to curry a function.
- curry – Curry your
functions using function bind syntax.
- compose-function
– Compose a new function from smaller functions.
- functionize –
A collection of functions which aid in making non-functional libraries
functional.
- lambdajs – The
full ECMAScript API done a functional way.
- fp-dom – Making the DOM
functional.
- react-on-lambda -
Replace JSX in React with functions (currying, compositions and
etc).
- trifl – A functional
user interface library with unidirectional dataflow and a virtual
dom.
- funcy – An
experiment in adding functional pattern matching to JavaScript.
Experimental :triangular_flag_on_post:
- date-fp – A
functional utility library for working with JavaScript dates. All
functions in date-fp are pure, autocurried and will not mutate the date
objects they are applied to.
- js-joda – An
immutable date and time library that provides a simple, domain-driven
and clean API based on the ISO8601 calendar.
- _part_ – A micro
library that encourages functional programming by making native methods
available as partially applied functions.
- claire – A
property-based testing library for clearly specifying code invariants
and behaviour.
- FPO.js – FP library for
JavaScript by Kyle Simpson (aka getify). Supports named-argument style
methods.
- Javascript Parser
Combinator – Javascript parser combinator implementation inspired by
the Haskell’s Parsec
- fun-task – An
abstraction for managing asynchronous code in JS. Tasks are similar to
Promises with the key difference that Tasks can represent a computation
while Promises can represent only the results of a computation. Ships
with Flow type definitions.
- most – Ultra-high
performance reactive programming to help you compose asynchronous
operations on streams of values and events without many of the hazards
of side effects and mutable shared state.
- zen-signals –
☯ The simplest signal library possible
- funfix – Funfix is a
library of type classes and data types for Functional Programming in
JavaScript, TypeScript and Flow. +CT, +TS.
- pico-lambda -
Arrays, Strings and things the functional way. A 640b functional library
based on native methods. -TS.
- pareto-js -
An extremely small, intuitive and fast functional utility library for
JavaScript -TS.
- fpEs - A small
library provides simple usages of basic FP &
pattern-matching/sumtype & MonadIO/Rx & Optional for Javascript.
-TS.
- Creed –
Sophisticated and functionally-minded async with advanced features:
coroutines, promises, ES2015 iterables, fantasy-land. -TS.
- TGrid - Grid
Computing Framework, Network & Thread extension of TSTL, supporting RFC (Remote
Function Call). +TS.
- Ferrum – Iterator
library with support for objects as iterables, lazy evaulation
and
pipe(); implements Traits (from Rust)/Type Classes (from
Haskell) in JS. -TS.
- fp-ts - Typed
functional programming in TypeScript. +CT, +TS.
- iter-tools -
a rich toolset for working with iterables, both sync and async.
+TS.
- remeda A function library
roughly subsetting Ramda, but written in Typescript and thus more
type-friendly. +TS.
- futil-js - A
collection of functional utilities that could conceivably be part of a
library like lodash/fp, but for some reason or other are not.
- rubico - 🏞
[a]synchronous functional syntax
- rocket-pipes -
Powerful pipes, that chain Promise and ADT like Maybe or Either from
popular FP libraries. +TS
- omg-curry -
Comprehensive Curry Library with Operator Curry, Curry from functions,
Decurry and Infifnite Curries.
- lfi - A Lazy
Functional Iteration Library Supporting Sync, Async, and Concurrent
Iteration.
- ts-multimethod
- TypeScript multimethods inspired by Clojure multimethods. +TS
- ts-fp-di - Tiny
TypeScript functional dependency injection, based on Node.js
AsyncLocalStorage. +TS
- effect-ts – A
Fully-fledged functional effect system for typescript with a rich
standard library. +TS
- qio – A type-safe,
functional, performant, lawful, composable data structure that solves
practical problems of effect-full code in node and browser. +TS
- Ditox.js - Powerful
dependency injection container for building modular apps. +TS
- RxEffects -
Reactive state and effect management with RxJS. +TS
- fxts - Lazy evaluation
and concurrency. +TS
- ts-belt - Fast,
modern, and practical utility library for FP in TypeScript. (Uses a
data-first approach like remeda, but is faster
than remeda, ramda, rambda, and lodash/fp.)
- fp-multik - JS/TS
lightweight value-multimethod util
- true-myth A
library for safe, idiomatic null and error handling in TypeScript, with
Maybe and Result types, supporting both a
functional style and a more traditional method-call style
- ts-pattern -
The exhaustive Pattern Matching library for TypeScript, with smart type
inference. Pattern Matching is a code-branching technique coming from FP
languages.
- hyogwa -
Natural 🌿 effect system that fits TypeScript; Write codes as you write
plain typescript code.
- Verticalize -
Super lightweight function that looks and behaves like a pipe
operator.
- PureEval - A
powerful JavaScript functional programming toolset, including utility
functions and abstract data structures.
- context-fp -
Microscopic functional programming context aka dependency injection.
+TS
Data Structures
Write performant functional code by using the right data structures
for the task.
- Icepick Utilities
for treating frozen JavaScript objects as persistent immutable
collections
- Immutable.js
– Immutable persistent data collections.
- Immer – Immer is
a tiny package for immutable state based on copy-on-write mechanism.
+TS.
- Mori –
ClojureScript’s persistent data structures and supporting API from the
comfort of vanilla JavaScript.
- Baobab –
persistent and optionally immutable data tree with cursors.
- immutable-sequence.js
– High performance implementation of Immutable Sequence in JavaScript,
based on Finger
Trees.
- Timm – Immutability
helpers with fast reads and acceptable writes.
- Lazy.js – A utility
library with a lazy engine under the hood that strives to do as little
work as possible while being as flexible as possible.
- DerivableJS –
Functional Reactive State for JavaScript and TypeScript. DerivableJS
enables you to make elegant declarative statements about how your bits
of state are related. +TS.
- imlazy – Library for
creating and manipulating lazy iterables using the ES2015 iteration
protocols.
- collectable –
Super high-performance immutable data structures for modern JavaScript
and TypeScript applications. +TS.
- List - An extremely
fast immutable list with a comprehensive functional API. Designed to seamlessly
integrate with Ramda.
- prelude.ts -
Immutable persistent collections, functional constructs such as Option
and Either, and combinators. Implemented in Typescript but supports
javascript too. +CT, +TS.
- TSTL - C++ STL
(Standard Template Library) is implemented in TypeScript. STL
Containers, iterators, algorithms and functors, that following
functional programming rule, are provided. +TS.
Algebraic Data Types
Use the laws of math instead of always reinventing your own thing.
Algebraic!
- Fantasy
Land – Not a library, but a specification of the Monad laws for
libraries to follow.
- Static Land –
Specification similar to Fantasy Land but based on static methods rather
than instance methods.
- immutable-ext –
FantasyLand extensions for Immutable.js.
- daggy – Library
for creating tagged constructors.
- Sanctuary –
Sanctuary makes it possible to write safe code without null checks. +CT,
+TS.
- monet.js – A
library that assists functional programming by providing a rich set of
Monads and other useful functions. +CT, +TS.
- union-type – A
small JavaScript library for defining and using union types.
- freeky – A
collection of Free monads.
- Fluture – A Future
library with included control utilities, high performance and great
error messages.
- fantasy-combinators
– Common combinators.
- fantasy-birds –
Port of the Haskell package Data.Aviary.Birds. Everything for your
combinatory needs.
- crocks – A
collection of popular Algebraic Data Types with the main goal to curate
and provide not only a common interface between each type, but also all
of the helper functions needed to hit the ground running. -TS.
- kudo-js - A small
utility library with a set of Algebraic Data Types and Helper functions
to help you write code in a functional programming style in
Javascript
- purify - Functional
programming library for TypeScript focusing on ADTs. +CT, +TS.
- MojiScript- an
async-first, opinionated, and functional language designed to have 100%
compatibility with JavaScript engines
- Pratica - Small,
simple, easy FP data types for pragmatic and productive developers who
need to ship reliable code fast. +CT, +TS.
- Tifi - Tifi is a
library for functional programming in TypeScript. It solves a problem of
the existence of both
undefined and null. Tifi
is inspired by the OCaml/Reason utilities for the option data type. +CT,
+TS.
- sweet-monads -
A collection of popular monads (such as
Either and
Maybe) and the lazy iterator.
Lenses
- lenses –
Composable kmett style
lenses.
- optics – Profunctor
optics (Lens, Prism, iso).
- ramda-lens – :ram:
:mag_right: Lens library built on Ramda.
- fantasy-lenses
– Composable, immutable getters and setters. (Profunctor lenses
WIP)
- nanoscope – Lenses
with dotty support.
- partial.lenses –
Partial lenses is a comprehensive, high-performance optics library for
JavaScript.
- shades – A
lodash-inspired lens-like library for Javascript.
Functional
Languages that Compile to JavaScript
- ClojureScript
– Compiles Clojure, a hosted Lisp with
immutable persistent data structures, to JavaScript.
- Elm – A type-safe functional
programming language for declaratively creating web browser-based
graphical user interfaces. Implemented in Haskell.
- Fable - Compiles F# to readable JavaScript.
- PureScript – A small
strongly typed programming language that compiles to JavaScript.
- Idris – A general purpose
pure functional programming language with dependent types.
- GHCJS – Haskell to JavaScript compiler,
based on GHC.
- ElixirScript
– Compiles a subset of Elixir, a
dynamic, functional language designed for building scalable and
maintainable applications, to JavaScript.
- Js_of_ocaml – Compiles
OCaml bytecode to JavaScript, making it
possible to run OCaml programs in the browser.
- Reason – Reason is a new
interface to OCaml, a highly expressive dialect of the ML language
featuring type inference and static type checking.
- ReScript – (previously
known as Bucklescript)
ReScript is a type-safe language that compiles to the highest quality of
clean, readable and performant JavaScript code.
- Scala.js – Compiles Scala to JavaScript.
- LiveScript –
LiveScript has a straightforward mapping to JavaScript and allows you to
write expressive code devoid of repetitive boilerplate.
- Quack - A
multi-paradigm programming language with gradual and duck typing that
targets PHP and JS.
- ion - no BS JS
- RamdaScript -
A Lisp that compiles to opinionated JavaScript on top of RamdaJS
- RacketScript –
RacketScript aims to leverage both JavaScript and Racket’s ecosystem,
and make interoperability between them clean and smooth.
- Koka –
Koka is a function-oriented programming language that seperates pure
values from side-effecting computations with a familiar JavaScript like
syntax.
- TypeScript -
TypeScript is a typed superset of JavaScript that compiles to plain
JavaScript.
- Gleam - Gleam is a typed, functional
language that compiles to Erlang and JavaScript.
- eslint-plugin-fp
- ESLint rules for functional programming
- 4.5 – A functional
assertions library. If you prefer functional style APIs and practices in
JavaScript, this library aims to solve this with functionally-oriented
assertions that are lazy and monadic.
- hm-def – Runtime type
checking for JS with Hindley Milner signatures.
- ftor - A pluggable
runtime type checker and functional debugging tool that supports
parametric and row polymorphism, implicit rank-2 types and algebraic
data types via Scott Encoding.
Resources
Books
- Professor
Frisby’s Mostly Adequate Guide to Functional Programming – This is a
book on the functional paradigm in general using the world’s most
popular functional programming language: JavaScript. It’s a practical
introduction that builds up intuition through real-world examples.
Strongly recommended. By Brian
Lonsdorf (2016)
- Functional-Light
JavaScript – This book explores the core principles of functional
programming (FP) that can be applied to JavaScript. But what makes this
book different is that it approaches these principles without all the
heavy terminology.
- JavaScript
Allongé, the “Six” edition. Starts with as little as possible about
functions – but no less! – and builds up towards powerful combinators
and decorators. A foundational book. By Reginald Braithwaite (2016)
- Functional
Programming in JavaScript teaches JavaScript developers functional
techniques that will improve extensibility, modularity, reusability,
testability, and performance. Through concrete examples and jargon-free
explanations, this book teaches you how to apply functional programming
to real-life development tasks. By Luis Atencio (2016)
- Eloquent JavaScript. A
modern introduction to programming using JavaScript. By Marijn Haverbeke
(2014)
- Functional
JavaScript teaches how to create code that’s beautiful, safe, and
simple to understand and test by using JavaScript’s functional
programming support. By Michael
Fogus (2013)
- Grokking
Simplicity teaches functional programming from first principles. It
uses JavaScript for all code examples and it uses real-world scenarios.
By Eric Normand (2019)
- scriptum
- a no-frills functional programming library and a online course based
on it
Articles
- FP
Concepts in JavaScript – An introduction to Functional Programming
Concepts in JavaScript. Uses the Ramda library to teach the concepts of
composition, pointfree style, and functors through the simplest of
examples.
- Functional
programming with JavaScript – Another introduction to Functional
Programming in JavaScript with a focus on three key themes: computation
as the application of functions, statelessness, avoiding side
effects.
- A
gentle introduction to functional JavaScript – A four-part series
introduction functional programming in JavaScript that gets you up to
speed what all the hype about functional programming is all about.
- Functors
from first principle - explained with JS - Explaining functors
concept using JavaScript.
- Why
Curry Helps – A short overview of how to write reusable and
declarative code using currying.
- Favoring Curry -
Practical applications of currying using Ramda.
- Functional
Mumbo Jumbo – ADTs – A beginner-friendly introduction to Algebraic
Data Types.
- JavaScript
and Type Thinking – Learn to reason about your JavaScript code with
type thinking. Algebraic Data Types are introduced as a
conceptual basis to reason about program entities.
- Lazy,
composable, and modular JavaScript – Use four new features of ES6 –
iterables, generators, fat arrows, and for-of – in conjunction with
higher-order functions, function composition, and lazy evaluation, to
write cleaner and more modular JavaScript.
- Why Ramda – To those not
used to functional programming, Ramda seems to serve no purpose
whatsoever. However, it does offer a different style of coding, a style
that’s taken for granted in purely functional programming languages:
Ramda makes it simple for you to build complex logic through functional
composition.
- Monads
in JavaScript – An introduction to the Monad design pattern in
JavaScript.
- A
Monad in Practicality: First-Class Failures – A walk through some
practical use cases for specific monadic structures in JavaScript: use
the
Maybe monad to handle simple failure cases and model
more complex scenarios with the Either monad or the
Validation applicative functor.
- Functional
programming – Many articles on various aspects of functional
programming in JavaScript by Gleb Bahmutov.
- Functional
Programming Jargon – Jargon from the functional programming world
explained in JavaScript.
- Data
Structures in JavaScript – A series of blog posts that reimplements
various data structures in JavaScript to better understand their
benefits and downsides.
- So
You Want to be a Functional Programmer - Easy to understand, with
some examples, introduction to Functional Programming in Javascript and
Elm.
- Functional
Programming for JavaScript People - A complete introduction to
functional programming patterns by Chet Corcos with a lot of javascript
examples.
- Introduction
to Immutable.js and Functional Programming Concepts - Learn about
functional data structures and their uses in this overview of Facebook’s
popular library for JavaScript: Immutable.js.
- Master
the JavaScript Interview: What is Functional Programming? - A simple
introduction by @ericelliott to functional principles
and vocabulary.
- Composing
Software - A series of articles on learning functional programming
and compositional software techniques in JavaScript ES6+ from the ground
up by @ericelliott.
- Anonymous
Recursion in JavaScript - Short and easy to understand article about
implementing anonymous recursion in JavaScript.
- Functional
Composition in Javascript – Step by step explanation of how to
compose functions in javascript.
- Functional
Programming Principles in Javascript - Practical code examples to
learn functional programming concepts like pure function, immutability,
first-class entities, and higher order functions
- Basic
Monads in Javascript - Introduction to 2 easy monads in Javascript,
Maybe & Either.
- F# for
JavaScript Devs - Showcasing the similarities between F# and
JavaScript
- A
practical guide to writing more functional Javascript - A step by
step guide to convert imperative JavaScript to more declarative,
functional JavaScript.
- You
don’t (may not) need loops ➿ - Loops are one of the first
constructs that junior programmers learn, but they can pose many
potential issues in the software development process, and could be
avoided in many cases.
Videos
Examples and Exercises
- FPJS-Class –
Functional Programming learned through JavaScript.
- functional-javascript-workshop
– The goal of this workshop is to create realistic problems that can be
solved using terse, vanilla, idiomatic JavaScript to teach fundamental
functional programming features of JavaScript.
- functional-frontend-architecture
– A functional frontend framework. Based on
Ramda + union-type-js + Flyd + Snabbdom
- cube-composer
– A puzzle game inspired by functional programming.
- FP
Youtube Search – YouTube search app with ReactJS, Redux, and FP
concepts
- Hardcore
Functional Programming in JavaScript – Learn to apply techniques
from the forefront of computer science research to solve practical
problems in Javascript. Discover functional programming and see it
demonstrated step-by-step with how to build an example web app using
abstract interfaces like Monads, Functors, Monoids and Applicatives.
(commercial)
- Escape
from Callback Mountain - Design & refactoring tips for
Promise-based Functional JavaScript. Key benefits include better
readability, testability, and reusability. MIT.
- Learn Rx – A series of
interactive exercises introducing five basic ingredients of functional
(reactive) programming: the
map, filter,
concatAll, reduce, and zip
functions.
- Holdem
Evaluator - Yet another Holdem Evaluator with Ramda functional
style
Talk
Contribution
:star: Suggestions and PRs are welcome! :star:
Please read the contribution
guidelines to get started.
License

To the extent possible under law, Christoph Hermann has waived all
copyright and related or neighboring rights to this work.