/awesome-fp-js

:sunglasses: A curated list of awesome functional programming stuff in js

Awesome FP JS Awesome

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

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.
  • Folktale – Folktale is a suite of libraries for generic functional programming that allows you to write elegant modular applications with fewer bugs and more reuse.
  • lodash/fp – An instance of Lodash with its methods wrapped to produce immutable, auto-curried, iteratee-first, data-last methods.
  • 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.
  • 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.
  • bluebird-promisell - A practical functional programming library for promises.
  • prelude.ls – A functionally oriented utility library somewhat based off of Haskell's Prelude module.
  • preludejs - Hardcore Functional Programming for JavaScript.
  • allong.es – A collection of functions to facilitate writing JavaScript with functions as first-class values, designed to complement libraries like Underscore, not compete with them.
  • 1-liners – Functional tools that couldn’t be simpler. A dead simple functional utility belt, hand-crafted with love and attention.
  • 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.
  • trifl – A functional user interface library with unidirectional dataflow and a virtual dom.
  • funcy – An experiment in adding functional pattern matching to JavaScript. Experimental 🚩
  • 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.

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.
  • Mori – ClojureScript’s persistent data structures and supporting API from the comfort of vanilla JavaScript.
  • 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.
  • imlazy – Library for creating and manipulating lazy iterables using the ES2015 iteration protocols.

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.
  • ramda-fantasy – Fantasy-Land compatible types for easy integration with Ramda.js.
  • monet.js – A library that assists functional programming by providing a rich set of Monads and other useful functions.
  • 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.

Lenses

  • lenses – Composable kmett style lenses.
  • optics – Profunctor optics (Lens, Prism, iso).
  • ramda-lens – 🐏 🔎 Lens library built on Ramda.
  • fantasy-lenses – Composable, immutable getters and setters. (Profunctor lenses WIP)
  • nanoscope – Lenses with dotty support.
  • partial.lenses – Ramda compatible partial lenses. View, insert and update optional data.

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.
  • PureScript – A small strongly typed programming language that compiles to JavaScript.
  • Idris – A general purpose pure functional programming language with dependent types.
  • GHCJSHaskell 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.
  • BuckleScript – JavaScript backend for the OCaml compiler.
  • Reason – Reason is a new interface to OCaml, a highly expressive dialect of the ML language featuring type inference and static type checking.
  • 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.

Programming Tools

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)

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.
  • 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 featurs 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.

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)

Community

Related Lists

Talk

Contribution

⭐ Suggestions and PRs are welcome! ⭐

Please read the contribution guidelines to get started.

License

CC0

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