@rmstek/rms-ts-monad v1.0.1
RMS Typescript Monads
OneMany monad for TypeScript.
OneMany
I wrote the OneMany monad to work in conjunction with the Result monad, found in the npm rms-ts-monad package package.
I use the Result monad to capture the results of CRUD operations:
export type ResultOk = {
code: number, // a REST/HTTP status code (200 series)
payload: TBD // element or an element collection
}export type CrudError = {
code: number,
content: string
}export type CrudResult = Result<CrudError, ResultOk>;In the above example, ResultOk.payload can be a single or multiple instances of an entity
- to hold the results of a CRUD operation to create a single entity,
create(entity: Entity): Entity,ResultOk.payloadmust represent asingle Entity; - to hold the results of CRUD operations to read all entities,
read(): Entity[],ResultOk.payloadmust represent anEntity collection.
The OneMany monad comes to the rescue, enabling us to rewrite ResultOk:
export type ResultOk = {
code: number, // a REST/HTTP status code (200 series)
payload: OneMany // element or an element collection
}Importing OneMany
Here's everything that can be imported to use OneManys:
import { OneMany, One, Many } from 'rms-ts-monad'
const one = One(10)
const many = Many([10, 20, 30])OneMany.isOneMany
Returns whether this instance is a OneMany (either an One or a Many).
import { OneMany, One } from 'rms-ts-monad'
OneMany.isOneMany(One(10)) // trueOneMany.all
Creates a new One OneMany holding the tuple of all the values contained in the passed array if they were all One, else returns the first encountered Many.
import { OneMany, One, Many } from 'rms-ts-monad'
const result = OneMany.all([
One(20),
Many([10, 20, 30]),
One(200),
Many([40, 50, 60])
]) // Many([10, 20, 30]),isOne
Returns whether this is an instance of One
import { OneMany, One, Many } from 'rms-ts-monad'
One(10).isOne() // truemap
If OneMany is a One, maps it content, else propagates the Many.
import { OneMany, One, Many } from 'rms-ts-monad'
One(10).map(x => x * 2) // One(20)
Many([10, 20, 30]).map(x => x * 2) // Many([10, 20, 30])mapMany
If OneMany is a Many, maps it content, else propagates the One.
import { OneMany, One, Many } from 'rms-ts-monad'
One(10).mapMany(x => x * 2) // One(10)
Many([10, 20, 30]).mapMany(x => x * 2) // Many([20, 40, 60])flatMap
Maps the value contained in this OneMany with another OneMany; if it's a One it propagates a One, otherwise a Many;
import { OneMany, One, Many } from 'rms-ts-monad'
One(10).flatMap(x => One(x * 2)) // One(20)
Many([10, 20, 30]).flatMap(x => Many(x * 2)) // Many([20, 40, 60])fold
Applies the first function if this is an Many, else applies the second function. Note: Don't use in tight loops; use isOne() instead.
import { OneMany, One, Many } from 'rms-ts-monad'
One(10).fold(
many => console.error(JSON.stringfy(many)),
num => num * 2
) // 20
Many([10, 20, 30]).fold(
many => console.error(JSON.stringfy(many)),
num => num * 2
) // 10, 20, 304 years ago