@rmstek/rms-ts-monad
v1.0.1
Published
Typescript monads, focus is on simplicity and typesafety
Downloads
1
Maintainers
Readme
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.payload
must represent asingle Entity
; - to hold the results of CRUD operations to read all entities,
read(): Entity[]
,ResultOk.payload
must 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)) // true
OneMany.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() // true
map
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, 30