import * as A from 'fp-ts/Applicative' import { pipe } from 'fp-ts/function' import { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4, } from 'fp-ts/HKT' import * as RT from 'fp-ts/ReadonlyTuple' export const sequenceFst = RT.sequence export function sequenceSnd( F: A.Applicative4, ): ( ta: Readonly<[TE, Kind4]>, ) => Kind4> export function sequenceSnd( F: A.Applicative3, ): ( ta: Readonly<[TE, Kind3]>, ) => Kind3> export function sequenceSnd( F: A.Applicative3C, ): ( ta: Readonly<[TE, Kind3]>, ) => Kind3> export function sequenceSnd( F: A.Applicative2, ): ( ta: Readonly<[TE, Kind2]>, ) => Kind2> export function sequenceSnd( F: A.Applicative2C, ): ( ta: Readonly<[TE, Kind2]>, ) => Kind2> export function sequenceSnd( F: A.Applicative1, ): (ta: Readonly<[TE, Kind]>) => Kind> export function sequenceSnd(F: A.Applicative) { return (ta: Readonly<[TE, HKT]>) => pipe(ta, RT.swap, RT.sequence(F), (fa) => F.map(fa, RT.swap)) } export const traverseFst = RT.traverse export function traverseSnd( F: A.Applicative3, ): ( f: (a: A) => Kind3, ) => (ta: Readonly<[TE, A]>) => Kind3> export function traverseSnd( F: A.Applicative2, ): ( f: (a: A) => Kind2, ) => (ta: Readonly<[TE, A]>) => Kind2> export function traverseSnd( F: A.Applicative2C, ): ( f: (a: A) => Kind2, ) => (ta: Readonly<[TE, A]>) => Kind2> export function traverseSnd( F: A.Applicative1, ): ( f: (a: A) => Kind, ) => (ta: Readonly<[TE, A]>) => Kind> export function traverseSnd(F: A.Applicative) { return (f: (a: A) => HKT) => (ta: Readonly<[TE, A]>) => pipe(ta, RT.swap, RT.traverse(F)(f), (fa) => F.map(fa, RT.swap)) }