ultres
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

ultres

npm JavaScript Style Guide ci Coverage Status

Flexible and functional Result type for handling success and error cases.

Naming Things Is Hard™

Result > Res ult > ult Res > Ultres.

Yup.

Why

  • Zero dependencies: banana only, no gorilla or jungle whatsoever
  • FP: source is just a set of dead-simple closures
  • ESM: native ESM package
  • CommonJS: support for older runtimes
  • TypeScript: first-class support
  • ES6: only used ES6 features
  • Familiar APIs: most of the idea were stolen from Rust
  • Promise support: added Promise/async support with the AsyncResult lib (see docs)

Install

npm i ultres

Quick example

import Result from 'ultres'
import AsyncResult from 'ultres/async'

const integer = value => {
  if (typeof value === 'bigint' || Number.isInteger(value)) {
    return Result.ok(value)
  } else if (typeof value === 'string' && /^[+-]\d+$/.test(value)) {
    return Result.ok(parseInt(value))
  } else {
    return Result.err(`Value ${value} is not an integer`)
  }
}

const double = value => value * 2

console.log(
  integer(5).map(double).unwrap() // 10
)

console.log(
  integer('-2').map(double).unwrap() // -4
)

console.log(
  integer(null).map(double).unwrapErr() // Value null is not an integer
)

const process = async value => {
  console.log(`process ${value} items`)
  return Result.ok(new Date())
}

const date = await AsyncResult.ok(integer(2))
  .andThen(process)
  .unwrap() // logs 'process 2 items'

console.log(date) // 2023-11-30T13:25:59.196Z

const errInstance = await AsyncResult.ok(Promise.reject(new Error('Oh no')))
  .catchRejection()
  .unwrapErr()

console.log(errInstance.message) // Oh no

Docs

See docs website.

Donate

Thank you!

"Buy Me A Coffee"

Package Sidebar

Install

npm i ultres

Weekly Downloads

18

Version

1.0.0

License

MIT

Unpacked Size

19.4 kB

Total Files

9

Last publish

Collaborators

  • greguz