/** * FromReaderStream is a Typeclass which represents the Natural Transformation from an ReaderStream into another * effect. * @since 0.13.9 */ import { Chain, Chain2, Chain3, Chain4, chainFirst } from 'fp-ts/Chain' import { flow } from 'fp-ts/function' import { HKT, HKT2, Kind2, Kind3, Kind4, URIS2, URIS3, URIS4 } from 'fp-ts/HKT' import { NaturalTransformation22, NaturalTransformation23R, NaturalTransformation23RC, NaturalTransformation24R, } from 'fp-ts/NaturalTransformation' import { ApplyVariance, Hkt, Initial } from './HKT' import * as Provide from './Provide' import * as RS from './ReaderStream' /** * @since 0.13.9 * @category Typeclass */ export type FromReaderStream = { readonly URI?: F readonly fromReaderStream: (stream: RS.ReaderStream) => HKT2 } /** * @since 0.13.9 * @category Combinator */ export type FromReaderStream2 = { readonly URI?: F readonly fromReaderStream: NaturalTransformation22 } /** * @since 0.13.9 * @category Typeclass */ export type FromReaderStream3 = { readonly URI?: F readonly fromReaderStream: NaturalTransformation23R } /** * @since 0.13.9 * @category Typeclass */ export type FromReaderStream3C = { readonly URI?: F readonly fromReaderStream: NaturalTransformation23RC } /** * @since 0.13.9 * @category Typeclass */ export type FromReaderStream4 = { readonly URI?: F readonly fromReaderStream: NaturalTransformation24R } /** * @since 0.13.9 * @category Constructor */ export function fromReaderStreamK( F: FromReaderStream2, ): ( f: (...args: A) => RS.ReaderStream, ) => (...args: A) => Hkt export function fromReaderStreamK( F: FromReaderStream3, ): ( f: (...args: A) => RS.ReaderStream, ) => (...args: A) => Hkt export function fromReaderStreamK( F: FromReaderStream4, ): ( f: (...args: A) => RS.ReaderStream, ) => (...args: A) => Hkt export function fromReaderStreamK( F: FromReaderStream, ): ( f: (...args: A) => RS.ReaderStream, ) => (...args: A) => Hkt export function fromReaderStreamK(F: FromReaderStream) { return (f: (...args: A) => RS.ReaderStream) => (...args: A) => F.fromReaderStream(f(...args)) } /** * @since 0.13.9 * @category Combinator */ export function chainReaderStreamK( F: FromReaderStream2, C: Chain2, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, B]> export function chainReaderStreamK( F: FromReaderStream3, C: Chain3, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, E, B]> export function chainReaderStreamK( F: FromReaderStream4, C: Chain4, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, E, B]> export function chainReaderStreamK( F: FromReaderStream, C: Chain, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, B]> export function chainReaderStreamK( F: FromReaderStream, C: Chain, ): (f: (value: A) => RS.ReaderStream) => (hkt: HKT) => HKT { return (f) => C.chain(flow(f, F.fromReaderStream) as any) } /** * @since 0.13.9 * @category Combinator */ export function chainFirstReaderStreamK( F: FromReaderStream2, C: Chain2, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, A]> export function chainFirstReaderStreamK( F: FromReaderStream3, C: Chain3, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, E, A]> export function chainFirstReaderStreamK( F: FromReaderStream4, C: Chain4, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, E, A]> export function chainFirstReaderStreamK( F: FromReaderStream, C: Chain, ): ( f: (value: A) => RS.ReaderStream, ) => (hkt: Hkt) => Hkt, A]> export function chainFirstReaderStreamK( F: FromReaderStream, C: Chain, ): (f: (value: A) => RS.ReaderStream) => (hkt: HKT) => HKT { const chainF = chainFirst(C) return (f) => chainF(flow(f, F.fromReaderStream) as any) } /** * @since 0.13.9 * @category Combinator */ export function provideSomeWithReaderStream( F: FromReaderStream4 & Provide.ProvideSome4 & Chain4, ): ( stream: RS.ReaderStream, ) => Provide.Provider4, Initial> export function provideSomeWithReaderStream( F: FromReaderStream3 & Provide.ProvideSome3 & Chain3, ): (stream: RS.ReaderStream) => Provide.Provider3> export function provideSomeWithReaderStream( F: FromReaderStream2 & Provide.ProvideSome2 & Chain2, ): (stream: RS.ReaderStream) => Provide.Provider2 export function provideSomeWithReaderStream( F: FromReaderStream & Provide.ProvideSome & Chain, ): (stream: RS.ReaderStream) => Provide.Provider export function provideSomeWithReaderStream( F: FromReaderStream & Provide.ProvideSome & Chain, ) { return flow(F.fromReaderStream, Provide.provideSomeWith(F)) } /** * @since 0.13.9 * @category Combinator */ export function provideAllWithReaderStream( F: FromReaderStream4 & Provide.ProvideAll4 & Chain4, ): ( stream: RS.ReaderStream, ) => (hkt: Kind4) => Kind4 export function provideAllWithReaderStream( F: FromReaderStream3 & Provide.ProvideAll3 & Chain3, ): (stream: RS.ReaderStream) => (hkt: Kind3) => Kind3 export function provideAllWithReaderStream( F: FromReaderStream2 & Provide.ProvideAll2 & Chain2, ): (stream: RS.ReaderStream) => (hkt: Kind2) => Kind2 export function provideAllWithReaderStream( F: FromReaderStream & Provide.ProvideAll & Chain, ): (stream: RS.ReaderStream) => (hkt: HKT2) => HKT2 export function provideAllWithReaderStream( F: FromReaderStream & Provide.ProvideAll & Chain, ) { return flow(F.fromReaderStream, Provide.provideAllWith(F)) } /** * @since 0.13.9 * @category Combinator */ export function useSomeWithReaderStream( F: FromReaderStream4 & Provide.UseSome4 & Chain4, ): ( stream: RS.ReaderStream, ) => Provide.Provider4, Initial> export function useSomeWithReaderStream( F: FromReaderStream3 & Provide.UseSome3 & Chain3, ): (stream: RS.ReaderStream) => Provide.Provider3> export function useSomeWithReaderStream( F: FromReaderStream2 & Provide.UseSome2 & Chain2, ): (stream: RS.ReaderStream) => Provide.Provider2 export function useSomeWithReaderStream( F: FromReaderStream & Provide.UseSome & Chain, ): (stream: RS.ReaderStream) => Provide.Provider export function useSomeWithReaderStream(F: FromReaderStream & Provide.UseSome & Chain) { return flow(F.fromReaderStream, Provide.useSomeWith(F)) } /** * @since 0.13.9 * @category Combinator */ export function useAllWithReaderStream( F: FromReaderStream4 & Provide.UseAll4 & Chain4, ): ( stream: RS.ReaderStream, ) => (hkt: Kind4) => Kind4 export function useAllWithReaderStream( F: FromReaderStream3 & Provide.UseAll3 & Chain3, ): (stream: RS.ReaderStream) => (hkt: Kind3) => Kind3 export function useAllWithReaderStream( F: FromReaderStream2 & Provide.UseAll2 & Chain2, ): (stream: RS.ReaderStream) => (hkt: Kind2) => Kind2 export function useAllWithReaderStream( F: FromReaderStream & Provide.UseAll & Chain, ): (stream: RS.ReaderStream) => (hkt: HKT2) => HKT2 export function useAllWithReaderStream(F: FromReaderStream & Provide.UseAll & Chain) { return flow(F.fromReaderStream, Provide.useAllWith(F)) }