@typed-f/monad
Version:
[![NPM Version][monad-npm-version-badge]][monad-npm] [repo-circleci-badge]: https://img.shields.io/circleci/project/github/Ailrun/typed-f/master.svg?logo=circleci [![Known Vulnerabilities][monad-snyk-badge]][monad-snyk] [![Supported TypeScript Version][re
41 lines (37 loc) • 1.6 kB
text/typescript
/*
* Copyright 2018-present Junyoung Clare Jang
*/
import { Applicative1, Applicative2, Applicative3, Applicative4 } from '@typed-f/applicative';
import { Fun } from '@typed-f/function';
import * as T from '@typed-f/tagged';
interface MonadBuilder<BindType> {
bind: BindType;
/**
* @desc
* alias of `bind`
*/
chain: BindType;
}
type MB<B> = MonadBuilder<B>;
type M1B<Tag extends keyof T.Tag1List<any>, A0> = <R>(
wf: Fun<[A0], T.Tag1List<R>[Tag]>,
) => T.Tag1List<R>[Tag];
type M2B<Tag extends keyof T.Tag2List<any, any>, A0, A1> = <R>(
wf: Fun<[A1], T.Tag2List<A0, R>[Tag]>,
) => T.Tag2List<A0, R>[Tag];
type M3B<Tag extends keyof T.Tag3List<any, any, any>, A0, A1, A2> = <R>(
wf: Fun<[A2], T.Tag3List<A0, A1, R>[Tag]>,
) => T.Tag3List<A0, A1, R>[Tag];
//tslint:disable-next-line: max-line-length
type M4B<Tag extends keyof T.Tag4List<any, any, any, any>, A0, A1, A2, A3> = <R>(
wf: Fun<[A3], T.Tag4List<A0, A1, A2, R>[Tag]>,
) => T.Tag4List<A0, A1, A2, R>[Tag];
export interface Monad1<Tag extends keyof T.Tag1List<any>, A0>
extends Applicative1<Tag, A0>, MB<M1B<Tag, A0>> {}
export interface Monad2<Tag extends keyof T.Tag2List<any, any>, A0, A1>
extends Applicative2<Tag, A0, A1>, MB<M2B<Tag, A0, A1>> {}
export interface Monad3<Tag extends keyof T.Tag3List<any, any, any>, A0, A1, A2>
extends Applicative3<Tag, A0, A1, A2>, MB<M3B<Tag, A0, A1, A2>> {}
//tslint:disable-next-line: max-line-length
export interface Monad4<Tag extends keyof T.Tag4List<any, any, any, any>, A0, A1, A2, A3>
extends Applicative4<Tag, A0, A1, A2, A3>, MB<M4B<Tag, A0, A1, A2, A3>> {}