Option and Result ~Monad for typescript, focus is on simplicity and typesafety
npm install space-monadOption and Result monads for TypeScript.
* Option())
* Option.all()
* Option.isOption
* None
* map
* flatMap
* filter
* fold
* orElse
* isDefined
* get
* getOrElse
* forEach
* contains
* exists
* toArray
Creates an Option from a value.
If the value is null or undefined, it will create a None, else a Some.
``ts`
const some = Option(33) // some === Some(33)
const none = Option(null) // none === None
If you already know the value is defined for sure (not nullable) or not, you can create a Some or None directly:
`ts`
const some = Some(33) // Some(null | undefined) wouldn't compile.
const none = None
#### Option.all([...optionsOrValues])
Creates a new Option holding the tuple of all the values contained in the passed array if they were all Some or non null/undefined values,
else returns None
`ts
const some = Option.all([
Option(10),
20,
Option(5)
])
// some === Some([10, 20, 5])
const none = Option.all([
Option(10),
None,
Option(5),
null
])
// none === None
`
Returns whether the passed instance in an Option, and refines its type
`ts`
import { Option, Some } from 'space-monad'
Option.isOption(Some(33)) // true
The Option constant representing no value.
`ts`
import { None } from 'space-monad'
Maps the value contained in this Some, else returns None.
Depending on the map function return value, a Some could be tranformed into a None, as a Some is guaranteed to never contain a null or undefined value.
`ts`
const some = Option(33).map(x => x * 2)
// some === Some(66)
Maps the value contained in this Some to a new Option, else returns None.
`ts`
const some = Option(33).flatMap(_ => Option(44))
// some === Some(44)
If this Option is a Some and the predicate returns true, keep that Some.
In all other cases, return None.
`ts`
const some = Option(33).filter(x => x > 32)
// some === Some(33)
Applies the first function if this is a None, else applies the second function.
Note: Since this method creates 2 functions everytime it runs, don't use in tight loops; use isDefined() instead.
`ts`
const count = Option(10).fold(
() => 100, // None
count => count * 10 // Some
)
Transforms this option into an Array or either 1 or 0 element.
Returns this Option unless it's a None, in which case the provided alternative is returned.
`ts`
const some = Option(null).orElse(() => Option(33))
// some === Some(33)
Some instances return their value, whereas None always return undefined.
This method never throws.
`ts`
const value = Some(33).get()
// value === 33
Returns whether this Option has a defined value (i.e, it's a Some(value))
Note: this refines the type of the Option to be a Some so it's guaranteed its value is not null/undefined.
Returns this Option's value if it's a Some, else return the provided alternative
`ts
const value = Option(undefined).getOrElse(33)
// value === 33
`
Applies the given procedure to the option's value, if it is non empty.
`ts`
Option(33).forEach(x => console.log(x))
Returns whether this option is a Some that contain a specific value, using ===
`ts`
Option(30).contains(30) // true
Returns whether this option is a Some with a value satisfying the predicate.
`ts`
Option(30).exists(n => n > 10) // true
* Result, Ok, Err
* Result.isResult
* Result.all
* isOk
* map
* mapError
* flatMap
* fold
A Result is the result of a computation that may fail. An Ok represents a successful computation, while an Err represent the error case.
Here's everything that can be imported to use Results:
`ts
import { Result, Ok, Err } from 'space-monad'
const ok = Ok(10)
const err = Err('oops')
`
Returns whether this instance is a Result (either an Ok or a Err) and refines its type
`ts
import { Result, Ok } from 'space-monad'
Result.isResult(Ok(10)) // true
`
Creates a new Ok Result holding the tuple of all the values contained in the passed array if they were all Ok,
else returns the first encountered Err.
`ts
import { Result, Ok, Err } from 'space-monad'
const result = Result.all([
Ok(20),
Err('nooo'),
Ok(200),
Err('oops')
]) // Err('nooo')
`
Returns whether this is an instance of Ok
`ts
import { Result, Ok, Err } from 'space-monad'
Ok(10).isOk() // true
`
Maps the value contained in this Result if it's an Ok, else propagates the Error.
`ts
import { Result, Ok, Err } from 'space-monad'
Ok(10).map(x => x * 2) // Ok(20)
Err(10).map(x => x * 2) // Err(10)
`
Maps the Error contained in this Result if it's an Err, else propagates the Ok.
`ts
import { Result, Ok, Err } from 'space-monad'
Ok(10).mapError(x => x * 2) // Ok(10)
Err(10).mapError(x => x * 2) // Err(20)
`
Maps the value contained in this Result with another Result if it's an Ok, else propagates the Error.
Note: It is allowed to return a Result with a different Error type.
`ts
import { Result, Ok, Err } from 'space-monad'
Ok(10).flatMap(x => Ok(x * 2)) // Ok(20)
Ok(10).flatMap(x => Err(x * 2)) // Err(20)
`
Applies the first function if this is an Err, else applies the second function.
Note: Don't use in tight loops; use isOk() instead.
`ts
import { Result, Ok, Err } from 'space-monad'
Ok(10).fold(
err => console.error(err),
num => num * 2
) // 20
``