diff --git a/docs/modules/ReaderTask.ts.md b/docs/modules/ReaderTask.ts.md index 580cb8d28..a379c4857 100644 --- a/docs/modules/ReaderTask.ts.md +++ b/docs/modules/ReaderTask.ts.md @@ -29,11 +29,15 @@ Added in v2.3.0 - [asksReaderTaskW](#asksreadertaskw) - [chainFirst](#chainfirst) - [chainFirstIOK](#chainfirstiok) + - [chainFirstReaderIOK](#chainfirstreaderiok) + - [chainFirstReaderIOKW](#chainfirstreaderiokw) - [chainFirstReaderK](#chainfirstreaderk) - [chainFirstReaderKW](#chainfirstreaderkw) - [chainFirstTaskK](#chainfirsttaskk) - [chainFirstW](#chainfirstw) - [chainIOK](#chainiok) + - [chainReaderIOK](#chainreaderiok) + - [chainReaderIOKW](#chainreaderiokw) - [chainReaderK](#chainreaderk) - [chainReaderKW](#chainreaderkw) - [chainTaskK](#chaintaskk) @@ -41,6 +45,7 @@ Added in v2.3.0 - [flatten](#flatten) - [flattenW](#flattenw) - [fromIOK](#fromiok) + - [fromReaderIOK](#fromreaderiok) - [fromReaderK](#fromreaderk) - [fromTaskK](#fromtaskk) - [local](#local) @@ -72,6 +77,7 @@ Added in v2.3.0 - [natural transformations](#natural-transformations) - [fromIO](#fromio) - [fromReader](#fromreader) + - [fromReaderIO](#fromreaderio) - [fromTask](#fromtask) - [utils](#utils) - [ApT](#apt) @@ -266,6 +272,32 @@ export declare const chainFirstIOK: (f: (a: A) => IO) => (first: Rea Added in v2.10.0 +## chainFirstReaderIOK + +**Signature** + +```ts +export declare const chainFirstReaderIOK: ( + f: (a: A) => RIO.ReaderIO +) => (ma: ReaderTask) => ReaderTask +``` + +Added in v2.13.0 + +## chainFirstReaderIOKW + +Less strict version of [`chainFirstReaderIOK`](#chainfirstreaderiok). + +**Signature** + +```ts +export declare const chainFirstReaderIOKW: ( + f: (a: A) => RIO.ReaderIO +) => (ma: ReaderTask) => ReaderTask +``` + +Added in v2.13.0 + ## chainFirstReaderK **Signature** @@ -332,6 +364,32 @@ export declare const chainIOK: (f: (a: A) => IO) => (first: ReaderTa Added in v2.4.0 +## chainReaderIOK + +**Signature** + +```ts +export declare const chainReaderIOK: ( + f: (a: A) => RIO.ReaderIO +) => (ma: ReaderTask) => ReaderTask +``` + +Added in v2.13.0 + +## chainReaderIOKW + +Less strict version of [`chainReaderIOK`](#chainreaderiok). + +**Signature** + +```ts +export declare const chainReaderIOKW: ( + f: (a: A) => RIO.ReaderIO +) => (ma: ReaderTask) => ReaderTask +``` + +Added in v2.13.0 + ## chainReaderK **Signature** @@ -416,6 +474,18 @@ export declare const fromIOK: (f: (...a: A) => IO) => (...a: A) => R Added in v2.4.0 +## fromReaderIOK + +**Signature** + +```ts +export declare const fromReaderIOK: ( + f: (...a: A) => RIO.ReaderIO +) => (...a: A) => ReaderTask +``` + +Added in v2.13.0 + ## fromReaderK **Signature** @@ -723,6 +793,16 @@ export declare const fromReader: NaturalTransformation22<'Reader', 'ReaderTask'> Added in v2.3.0 +## fromReaderIO + +**Signature** + +```ts +export declare const fromReaderIO: (fa: RIO.ReaderIO) => ReaderTask +``` + +Added in v2.13.0 + ## fromTask **Signature** diff --git a/dtslint/ts3.5/ReaderTask.ts b/dtslint/ts3.5/ReaderTask.ts index ce12aa9dd..20fb84af1 100644 --- a/dtslint/ts3.5/ReaderTask.ts +++ b/dtslint/ts3.5/ReaderTask.ts @@ -1,6 +1,79 @@ import * as _ from '../../src/ReaderTask' +import * as RIO from '../../src/ReaderIO' import { pipe } from '../../src/function' +interface R1 { + foo: string +} + +interface R2 { + bar: string +} + +// +// fromReaderIO +// + +// $ExpectType ReaderTask +_.fromReaderIO(RIO.of(true)) + +// +// fromReaderIOK +// + +// $ExpectType (a: boolean) => ReaderTask +_.fromReaderIOK((a: boolean) => RIO.of(a)) + +// +// chainReaderIOKW +// + +// $ExpectType ReaderTask +pipe( + _.of(1), + _.chainReaderIOKW(() => RIO.of(true)) +) + +// +// chainReaderIOK +// + +// $ExpectType ReaderTask +pipe( + _.of(1), + _.chainReaderIOK(() => RIO.of(1)) +) + +pipe( + _.of(1), // $ExpectError + _.chainReaderIOK(() => RIO.of(true)) +) + +// +// chainFirstReaderIOKW +// + +// $ExpectType ReaderTask +pipe( + _.of(1), + _.chainFirstReaderIOKW(() => RIO.of(true)) +) + +// +// chainFirstReaderIOK +// + +// $ExpectType ReaderTask +pipe( + _.of(1), + _.chainFirstReaderIOK(() => RIO.of(true)) +) + +pipe( + _.of(1), // $ExpectError + _.chainFirstReaderIOK(() => RIO.of(true)) +) + // // Do // diff --git a/src/ReaderTask.ts b/src/ReaderTask.ts index 2e739f9b2..8f96f40f4 100644 --- a/src/ReaderTask.ts +++ b/src/ReaderTask.ts @@ -34,6 +34,7 @@ import { MonadTask2 } from './MonadTask' import { Monoid } from './Monoid' import { Pointed2 } from './Pointed' import * as R from './Reader' +import * as RIO from './ReaderIO' import * as RT from './ReaderT' import { ReadonlyNonEmptyArray } from './ReadonlyNonEmptyArray' import { Semigroup } from './Semigroup' @@ -43,6 +44,7 @@ import * as T from './Task' // model // ------------------------------------------------------------------------------------- +import ReaderIO = RIO.ReaderIO import Task = T.Task /** @@ -75,6 +77,12 @@ export const fromTask: FromTask2['fromTask'] = /*#__PURE__*/ R.of */ export const fromIO: FromIO2['fromIO'] = /*#__PURE__*/ flow(T.fromIO, fromTask) +/** + * @category natural transformations + * @since 2.13.0 + */ +export const fromReaderIO: (fa: ReaderIO) => ReaderTask = R.map(T.fromIO) + // ------------------------------------------------------------------------------------- // combinators // ------------------------------------------------------------------------------------- @@ -487,6 +495,50 @@ export const chainFirstReaderKW: ( f: (a: A) => R.Reader ) => (ma: ReaderTask) => ReaderTask = chainFirstReaderK as any +/** + * @category combinators + * @since 2.13.0 + */ +export const fromReaderIOK = , R, B>( + f: (...a: A) => ReaderIO +): ((...a: A) => ReaderTask) => (...a) => fromReaderIO(f(...a)) + +/** + * Less strict version of [`chainReaderIOK`](#chainreaderiok). + * + * @category combinators + * @since 2.13.0 + */ +export const chainReaderIOKW: ( + f: (a: A) => ReaderIO +) => (ma: ReaderTask) => ReaderTask = (f) => chainW(fromReaderIOK(f)) + +/** + * @category combinators + * @since 2.13.0 + */ +export const chainReaderIOK: ( + f: (a: A) => ReaderIO +) => (ma: ReaderTask) => ReaderTask = chainReaderIOKW + +/** + * Less strict version of [`chainFirstReaderIOK`](#chainfirstreaderiok). + * + * @category combinators + * @since 2.13.0 + */ +export const chainFirstReaderIOKW: ( + f: (a: A) => ReaderIO +) => (ma: ReaderTask) => ReaderTask = (f) => chainFirstW(fromReaderIOK(f)) + +/** + * @category combinators + * @since 2.13.0 + */ +export const chainFirstReaderIOK: ( + f: (a: A) => ReaderIO +) => (ma: ReaderTask) => ReaderTask = chainFirstReaderIOKW + /** * @category instances * @since 2.10.0 diff --git a/test/ReaderTask.ts b/test/ReaderTask.ts index 21dfd499a..952007eee 100644 --- a/test/ReaderTask.ts +++ b/test/ReaderTask.ts @@ -2,6 +2,7 @@ import { pipe, SK } from '../src/function' import * as I from '../src/IO' import { monoidString } from '../src/Monoid' import * as R from '../src/Reader' +import * as RIO from '../src/ReaderIO' import * as _ from '../src/ReaderTask' import * as RA from '../src/ReadonlyArray' import { ReadonlyNonEmptyArray } from '../src/ReadonlyNonEmptyArray' @@ -86,6 +87,10 @@ describe('ReaderTask', () => { U.deepStrictEqual(await _.fromReader(R.of(1))({})(), 1) }) + it('fromReaderIO', async () => { + U.deepStrictEqual(await _.fromReaderIO(RIO.of(1))({})(), 1) + }) + // ------------------------------------------------------------------------------------- // combinators // ------------------------------------------------------------------------------------- @@ -125,6 +130,31 @@ describe('ReaderTask', () => { U.deepStrictEqual(await pipe(_.of('a'), _.chain(f))({})(), 1) }) + it('fromReaderIOK', async () => { + const f = (s: string) => RIO.of(s.length) + U.deepStrictEqual(await _.fromReaderIOK(f)('a')(undefined)(), 1) + }) + + it('chainReaderIOKW', async () => { + const f = (s: string) => RIO.of(s.length) + U.deepStrictEqual(await pipe(_.of('a'), _.chainReaderIOKW(f))({})(), 1) + }) + + it('chainReaderIOK', async () => { + const f = (s: string) => RIO.of(s.length) + U.deepStrictEqual(await pipe(_.of('a'), _.chainReaderIOK(f))(undefined)(), 1) + }) + + it('chainFirstReaderIOKW', async () => { + const f = (s: string) => RIO.of(s.length) + U.deepStrictEqual(await pipe(_.of('a'), _.chainFirstReaderIOKW(f))({})(), 'a') + }) + + it('chainFirstReaderIOK', async () => { + const f = (s: string) => RIO.of(s.length) + U.deepStrictEqual(await pipe(_.of('a'), _.chainFirstReaderIOK(f))({})(), 'a') + }) + // ------------------------------------------------------------------------------------- // instances // -------------------------------------------------------------------------------------