All Projects β†’ hqoss β†’ Monads

hqoss / Monads

Licence: mit
πŸ‘» Type safe Option, Result, and Either types; inspired by Rust

Programming Languages

javascript
184084 projects - #8 most used programming language
typescript
32286 projects
rust
11053 projects
types
53 projects

Projects that are alternatives of or similar to Monads

True Myth
A library for safer and smarter error- and "nothing"-handling in TypeScript.
Stars: ✭ 360 (+57.89%)
Mutual labels:  monads
Monad Skeleton
Operational monad library
Stars: ✭ 30 (-86.84%)
Mutual labels:  monads
Swift Monad Maybe Reader And Try
Proof of concept: Maybe, Reader and Try monad
Stars: ✭ 159 (-30.26%)
Mutual labels:  monads
Arrow
Ξ›rrow - Functional companion to Kotlin's Standard Library
Stars: ✭ 4,771 (+1992.54%)
Mutual labels:  monads
Freestyle
A cohesive & pragmatic framework of FP centric Scala libraries
Stars: ✭ 627 (+175%)
Mutual labels:  monads
Fear
Ruby port of some Scala's monads
Stars: ✭ 58 (-74.56%)
Mutual labels:  monads
Monio
Async-capable IO monad for JS
Stars: ✭ 311 (+36.4%)
Mutual labels:  monads
Maryamyriameliamurphies.js
A library of Haskell-style morphisms ported to ES2015 JavaScript using Babel.
Stars: ✭ 177 (-22.37%)
Mutual labels:  monads
Kea
Composable Functional Programming in R
Stars: ✭ 18 (-92.11%)
Mutual labels:  monads
Pipetools
Functional plumbing for Python
Stars: ✭ 143 (-37.28%)
Mutual labels:  monads
Fetch
Simple & Efficient data access for Scala and Scala.js
Stars: ✭ 453 (+98.68%)
Mutual labels:  monads
Oslash
Functors, Applicatives, And Monads in Python
Stars: ✭ 561 (+146.05%)
Mutual labels:  monads
Funcj
Assorted functional-oriented data structures and algorithms for Java.
Stars: ✭ 60 (-73.68%)
Mutual labels:  monads
Whyhaskellmatters
In this article I try to explain why Haskell keeps being such an important language by presenting some of its most important and distinguishing features and detailing them with working code examples. The presentation aims to be self-contained and does not require any previous knowledge of the language.
Stars: ✭ 418 (+83.33%)
Mutual labels:  monads
Fpgo
Monad, Functional Programming features for Golang
Stars: ✭ 165 (-27.63%)
Mutual labels:  monads
Language Ext
C# functional language extensions - a base class library for functional programming
Stars: ✭ 3,964 (+1638.6%)
Mutual labels:  monads
Purefun
Functional Programming library for Java
Stars: ✭ 37 (-83.77%)
Mutual labels:  monads
Mu Haskell
Mu (ΞΌ) is a purely functional framework for building micro services.
Stars: ✭ 215 (-5.7%)
Mutual labels:  monads
Scala Workflow
Boilerplate-free syntax for computations with effects
Stars: ✭ 173 (-24.12%)
Mutual labels:  monads
Datum
pure functional and generic programming for Erlang
Stars: ✭ 111 (-51.32%)
Mutual labels:  monads

Node.js CI Codacy Badge Codacy Badge GuardRails badge npm

πŸ‘» Monads

Type safe Option, Result, and Either types; inspired by Rust.

Table of contents

⏳ Install

Deno

import { Some } from "https://deno.land/x/monads/mod.ts"

const air = Some("air").unwrapOr("baloon")

console.log(air) // "air"

Node.js and the Browser

npm install @hqoss/monads

⚠️ NOTE: The project is configured to target ES2018 and the library uses commonjs module resolution. Read more in the Node version support section.

πŸ“ Usage

Option<T>

See full documentation

import { Option, Some, None } from "@hqoss/monads"

function divide(numerator: number, denominator: number): Option<number> {
  if (denominator === 0) {
    return None
  } else {
    return Some(numerator / denominator)
  }
};

// The return value of the function is an option
const result = divide(2.0, 3.0)

// Pattern match to retrieve the value
const message = result.match({
  some: res => `Result: ${res}`,
  none: "Cannot divide by 0",
})

console.log(message) // "Result: 0.6666666666666666"

Result<T, E>

See full documentation

import { Result, Ok, Err } from "@hqoss/monads"

function getIndex(values: string[], value: string): Result<number, string> {
  const index = values.indexOf(value)

  switch (index) {
    case -1:
      return Err("Value not found")
  default:
    return Ok(index)
  }
}

console.log(getIndex(["a", "b", "c"], "b")) // Ok(1)
console.log(getIndex(["a", "b", "c"], "z")) // Err("Value not found")

Either<L, R>

See full documentation

import { Either } from "@hqoss/monads"

function getLabel(uncertainDate: Either<Date, string>) {
  return uncertainDate.match({
    left: date => date.toLocaleDateString(),
    right: text => `<abbr title="${text}">an uncertain date</abbr>`,
  })
}

API Docs

See full API Documentation here.

Core design principles

  • Code quality; This package may end up being used in mission-critical software, so it's important that the code is performant, secure, and battle-tested.

  • Developer experience; Developers must be able to use this package with no significant barriers to entry. It has to be easy-to-find, well-documented, and pleasant to use.

  • Modularity & Configurability; It's important that users can compose and easily change the ways in which they consume and work with this package.

Node version support

The project is configured to target ES2018. In practice, this means consumers should run on Node 12 or higher, unless additional compilation/transpilation steps are in place to ensure compatibility with the target runtime.

Please see https://node.green/#ES2018 for reference.

Why ES2018

Firstly, according to the official Node release schedule, Node 12.x entered LTS on 2019-10-21 and is scheduled to enter Maintenance on 2020-10-20. With the End-of-Life scheduled for April 2022, we are confident that most users will now be running 12.x or higher.

Secondly, the 7.3 release of V8 (ships with Node 12.x or higher) includes "zero-cost async stack traces".

From the release notes:

We are turning on the --async-stack-traces flag by default. Zero-cost async stack traces make it easier to diagnose problems in production with heavily asynchronous code, as the error.stack property that is usually sent to log files/services now provides more insight into what caused the problem.

Testing

Ava and Jest were considered. Jest was chosen as it is very easy to configure and includes most of the features we need out-of-the-box.

Further investigation will be launched in foreseeable future to consider moving to Ava.

We prefer using Nock over mocking.

TODO

A quick and dirty tech debt tracker before we move to Issues.

  • [ ] Write a Contributing guide
  • [ ] Complete testing section, add best practices
  • [ ] Describe scripts and usage, add best practices
  • [ ] Add typespec and generate docs
  • [ ] Describe security best practices, e.g. npm doctor, npm audit, npm outdated, ignore-scripts in .npmrc, etc.
  • [ ] Add "Why should I use this" section
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].