fp-ts-std
Version:
The missing pseudo-standard library for fp-ts.
227 lines • 12.7 kB
TypeScript
/**
* Utility functions to accommodate `fp-ts/Monad`.
*
* @since 0.15.0
*/
import type { Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from "fp-ts/HKT";
import type { Monad1, Monad2, Monad2C, Monad3, Monad3C, Monad4 } from "fp-ts/Monad";
import type { Predicate } from "fp-ts/Predicate";
/**
* Monadic if/then/else. Only executes the relevant action.
*
* @example
* import { ifM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f =
* ifM(IO.Monad)(IO.of(true))
* (IO.of('foo'))(IO.of('bar'))
*
* assert.strictEqual(execute(f), 'foo')
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function ifM<M extends URIS4>(M: Monad4<M>): <S, R, E>(p: Kind4<M, S, R, E, boolean>) => <A>(x: Kind4<M, S, R, E, A>) => (y: Kind4<M, S, R, E, A>) => Kind4<M, S, R, E, A>;
export declare function ifM<M extends URIS3>(M: Monad3<M>): <R, E>(p: Kind3<M, R, E, boolean>) => <A>(x: Kind3<M, R, E, A>) => (y: Kind3<M, R, E, A>) => Kind3<M, R, E, A>;
export declare function ifM<M extends URIS3, E>(M: Monad3C<M, E>): <R>(p: Kind3<M, R, E, boolean>) => <A>(x: Kind3<M, R, E, A>) => (y: Kind3<M, R, E, A>) => Kind3<M, R, E, A>;
export declare function ifM<M extends URIS2>(M: Monad2<M>): <E>(p: Kind2<M, E, boolean>) => <A>(x: Kind2<M, E, A>) => (y: Kind2<M, E, A>) => Kind2<M, E, A>;
export declare function ifM<M extends URIS2, E>(M: Monad2C<M, E>): (p: Kind2<M, E, boolean>) => <A>(x: Kind2<M, E, A>) => (y: Kind2<M, E, A>) => Kind2<M, E, A>;
export declare function ifM<M extends URIS>(M: Monad1<M>): (p: Kind<M, boolean>) => <A>(x: Kind<M, A>) => (y: Kind<M, A>) => Kind<M, A>;
/**
* Monadic &&. Short-circuits.
*
* @example
* import { andM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f = andM(IO.Monad)(IO.of(true))
*
* assert.strictEqual(execute(f(IO.of(true))), true)
* assert.strictEqual(execute(f(IO.of(false))), false)
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function andM<M extends URIS4>(M: Monad4<M>): <S, R, E>(x: Kind4<M, S, R, E, boolean>) => (y: Kind4<M, S, R, E, boolean>) => Kind4<M, S, R, E, boolean>;
export declare function andM<M extends URIS3>(M: Monad3<M>): <R, E>(x: Kind3<M, R, E, boolean>) => (y: Kind3<M, R, E, boolean>) => Kind3<M, R, E, boolean>;
export declare function andM<M extends URIS3, E>(M: Monad3C<M, E>): <R>(x: Kind3<M, R, E, boolean>) => (y: Kind3<M, R, E, boolean>) => Kind3<M, R, E, boolean>;
export declare function andM<M extends URIS2>(M: Monad2<M>): <E>(x: Kind2<M, E, boolean>) => (y: Kind2<M, E, boolean>) => Kind2<M, E, boolean>;
export declare function andM<M extends URIS2, E>(M: Monad2C<M, E>): (x: Kind2<M, E, boolean>) => (y: Kind2<M, E, boolean>) => Kind2<M, E, boolean>;
export declare function andM<M extends URIS>(M: Monad1<M>): (x: Kind<M, boolean>) => (y: Kind<M, boolean>) => Kind<M, boolean>;
/**
* Monadic ||. Short-circuits.
*
* @example
* import { orM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f = orM(IO.Monad)(IO.of(false))
*
* assert.strictEqual(execute(f(IO.of(true))), true)
* assert.strictEqual(execute(f(IO.of(false))), false)
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function orM<M extends URIS4>(M: Monad4<M>): <S, R, E>(x: Kind4<M, S, R, E, boolean>) => (y: Kind4<M, S, R, E, boolean>) => Kind4<M, S, R, E, boolean>;
export declare function orM<M extends URIS3>(M: Monad3<M>): <R, E>(x: Kind3<M, R, E, boolean>) => (y: Kind3<M, R, E, boolean>) => Kind3<M, R, E, boolean>;
export declare function orM<M extends URIS3, E>(M: Monad3C<M, E>): <R>(x: Kind3<M, R, E, boolean>) => (y: Kind3<M, R, E, boolean>) => Kind3<M, R, E, boolean>;
export declare function orM<M extends URIS2>(M: Monad2<M>): <E>(x: Kind2<M, E, boolean>) => (y: Kind2<M, E, boolean>) => Kind2<M, E, boolean>;
export declare function orM<M extends URIS2, E>(M: Monad2C<M, E>): (x: Kind2<M, E, boolean>) => (y: Kind2<M, E, boolean>) => Kind2<M, E, boolean>;
export declare function orM<M extends URIS>(M: Monad1<M>): (x: Kind<M, boolean>) => (y: Kind<M, boolean>) => Kind<M, boolean>;
/**
* Monadic `allPass`. Short-circuits.
*
* @example
* import { constant } from 'fp-ts/function'
* import { allPassM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f = allPassM(IO.Monad)
*
* assert.strictEqual(execute(f([constant(IO.of(true)), constant(IO.of(true))])('foo')), true)
* assert.strictEqual(execute(f([constant(IO.of(true)), constant(IO.of(false))])('foo')), false)
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function allPassM<M extends URIS4>(M: Monad4<M>): <S, R, E, A>(f: Array<(x: A) => Kind4<M, S, R, E, boolean>>) => (x: A) => Kind4<M, S, R, E, boolean>;
export declare function allPassM<M extends URIS3>(M: Monad3<M>): <R, E, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function allPassM<M extends URIS3, E>(M: Monad3C<M, E>): <R, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function allPassM<M extends URIS2>(M: Monad2<M>): <E, A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function allPassM<M extends URIS2, E>(M: Monad2C<M, E>): <A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function allPassM<M extends URIS>(M: Monad1<M>): <A>(f: Array<(x: A) => Kind<M, boolean>>) => (x: A) => Kind<M, boolean>;
/**
* Monadic `anyPass`. Short-circuits.
*
* @example
* import { constant } from 'fp-ts/function'
* import { anyPassM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f = anyPassM(IO.Monad)
*
* assert.strictEqual(execute(f([constant(IO.of(true)), constant(IO.of(false))])('foo')), true)
* assert.strictEqual(execute(f([constant(IO.of(false)), constant(IO.of(false))])('foo')), false)
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function anyPassM<M extends URIS4>(M: Monad4<M>): <S, R, E, A>(f: Array<(x: A) => Kind4<M, S, R, E, boolean>>) => (x: A) => Kind4<M, S, R, E, boolean>;
export declare function anyPassM<M extends URIS3>(M: Monad3<M>): <R, E, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function anyPassM<M extends URIS3, E>(M: Monad3C<M, E>): <R, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function anyPassM<M extends URIS2>(M: Monad2<M>): <E, A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function anyPassM<M extends URIS2, E>(M: Monad2C<M, E>): <A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function anyPassM<M extends URIS>(M: Monad1<M>): <A>(f: Array<(x: A) => Kind<M, boolean>>) => (x: A) => Kind<M, boolean>;
/**
* Monadic `nonePass`. Short-circuits.
*
* @example
* import { constant } from 'fp-ts/function'
* import { nonePassM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
*
* const f = nonePassM(IO.Monad)
*
* assert.strictEqual(execute(f([constant(IO.of(false)), constant(IO.of(false))])('foo')), true)
* assert.strictEqual(execute(f([constant(IO.of(false)), constant(IO.of(true))])('foo')), false)
*
* @category 2 Typeclass Methods
* @since 0.15.0
*/
export declare function nonePassM<M extends URIS4>(M: Monad4<M>): <S, R, E, A>(f: Array<(x: A) => Kind4<M, S, R, E, boolean>>) => (x: A) => Kind4<M, S, R, E, boolean>;
export declare function nonePassM<M extends URIS3>(M: Monad3<M>): <R, E, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function nonePassM<M extends URIS3, E>(M: Monad3C<M, E>): <R, A>(f: Array<(x: A) => Kind3<M, R, E, boolean>>) => (x: A) => Kind3<M, R, E, boolean>;
export declare function nonePassM<M extends URIS2>(M: Monad2<M>): <E, A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function nonePassM<M extends URIS2, E>(M: Monad2C<M, E>): <A>(f: Array<(x: A) => Kind2<M, E, boolean>>) => (x: A) => Kind2<M, E, boolean>;
export declare function nonePassM<M extends URIS>(M: Monad1<M>): <A>(f: Array<(x: A) => Kind<M, boolean>>) => (x: A) => Kind<M, boolean>;
/**
* Like applicative `when`, but the condition is monadic.
*
* @example
* import { pipe } from 'fp-ts/function'
* import { whenM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import * as IOE from 'fp-ts/IOEither'
* import { log } from 'fp-ts/Console'
*
* const isInvalid = (n: number): IO.IO<boolean> => () => Date.now() !== 42
*
* pipe(
* IOE.of(123),
* IOE.chainFirstIOK(n =>
* whenM(IO.Monad)(isInvalid(n))(log(n))),
* )
*
* @category 2 Typeclass Methods
* @since 0.16.0
*/
export declare function whenM<F extends URIS4>(M: Monad4<F>): <S, R, E>(b: Kind4<F, S, R, E, boolean>) => (x: Kind4<F, S, R, E, void>) => Kind4<F, S, R, E, void>;
export declare function whenM<F extends URIS3>(M: Monad3<F>): <R, E>(b: Kind3<F, R, E, boolean>) => (x: Kind3<F, R, E, void>) => Kind3<F, R, E, void>;
export declare function whenM<F extends URIS3, E>(M: Monad3C<F, E>): <R>(b: Kind3<F, R, E, boolean>) => (x: Kind3<F, R, E, void>) => Kind3<F, R, E, void>;
export declare function whenM<F extends URIS2>(M: Monad2<F>): <E>(b: Kind2<F, E, boolean>) => (x: Kind2<F, E, void>) => Kind2<F, E, void>;
export declare function whenM<F extends URIS2, E>(M: Monad2C<F, E>): (b: Kind2<F, E, boolean>) => (x: Kind2<F, E, void>) => Kind2<F, E, void>;
export declare function whenM<F extends URIS>(M: Monad1<F>): (b: Kind<F, boolean>) => (x: Kind<F, void>) => Kind<F, void>;
/**
* The reverse of `whenM`.
*
* @example
* import { pipe } from 'fp-ts/function'
* import { unlessM } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import * as IOE from 'fp-ts/IOEither'
* import { log } from 'fp-ts/Console'
*
* const isValid = (n: number): IO.IO<boolean> => () => Date.now() === 42
*
* pipe(
* IOE.of(123),
* IOE.chainFirstIOK(n =>
* unlessM(IO.Monad)(isValid(n))(log(n))),
* )
*
* @category 2 Typeclass Methods
* @since 0.16.0
*/
export declare function unlessM<F extends URIS4>(M: Monad4<F>): <S, R, E>(b: Kind4<F, S, R, E, boolean>) => (x: Kind4<F, S, R, E, void>) => Kind4<F, S, R, E, void>;
export declare function unlessM<F extends URIS3>(M: Monad3<F>): <R, E>(b: Kind3<F, R, E, boolean>) => (x: Kind3<F, R, E, void>) => Kind3<F, R, E, void>;
export declare function unlessM<F extends URIS3, E>(M: Monad3C<F, E>): <R>(b: Kind3<F, R, E, boolean>) => (x: Kind3<F, R, E, void>) => Kind3<F, R, E, void>;
export declare function unlessM<F extends URIS2>(M: Monad2<F>): <E>(b: Kind2<F, E, boolean>) => (x: Kind2<F, E, void>) => Kind2<F, E, void>;
export declare function unlessM<F extends URIS2, E>(M: Monad2C<F, E>): (b: Kind2<F, E, boolean>) => (x: Kind2<F, E, void>) => Kind2<F, E, void>;
export declare function unlessM<F extends URIS>(M: Monad1<F>): (b: Kind<F, boolean>) => (x: Kind<F, void>) => Kind<F, void>;
/**
* Repeatedly execute an action until the result satisfies the predicate.
*
* @example
* import { until } from 'fp-ts-std/Monad'
* import * as IO from 'fp-ts/IO'
* import { execute } from 'fp-ts-std/IO'
* import { Predicate } from 'fp-ts/Predicate'
* import * as Rand from 'fp-ts/Random'
*
* const isValid: Predicate<number> = n => n > 0.5
*
* const genValid: IO.IO<number> = until(IO.Monad)(isValid)(Rand.random)
*
* assert.strictEqual(
* isValid(execute(genValid)),
* true,
* )
*
* @category 2 Typeclass Methods
* @since 0.18.0
*/
export declare function until<F extends URIS4>(M: Monad4<F>): <S, R, E, A>(p: Predicate<A>) => (x: Kind4<F, S, R, E, A>) => Kind4<F, S, R, E, A>;
export declare function until<F extends URIS3>(M: Monad3<F>): <R, E, A>(p: Predicate<A>) => (x: Kind3<F, R, E, A>) => Kind3<F, R, E, A>;
export declare function until<F extends URIS3, E>(M: Monad3C<F, E>): <R, A>(p: Predicate<A>) => (x: Kind3<F, R, E, A>) => Kind3<F, R, E, A>;
export declare function until<F extends URIS2>(M: Monad2<F>): <E, A>(p: Predicate<A>) => (x: Kind2<F, E, A>) => Kind2<F, E, A>;
export declare function until<F extends URIS2, E>(M: Monad2C<F, E>): <A>(p: Predicate<A>) => (x: Kind2<F, E, A>) => Kind2<F, E, A>;
export declare function until<F extends URIS>(M: Monad1<F>): <A>(p: Predicate<A>) => (x: Kind<F, A>) => Kind<F, A>;
//# sourceMappingURL=Monad.d.ts.map