/** * `Witherable` represents data structures which can be _partitioned_ with effects in some `Applicative` functor. * * Adapted from https://github.com/LiamGoodacre/purescript-filterable/blob/master/src/Data/Witherable.purs * * @since 2.0.0 */ import { HKT, Kind, Kind2, Kind3, URIS, URIS2, URIS3 } from './HKT' import { Option } from './Option' import { Traversable, Traversable1, Traversable2, Traversable2C, Traversable3 } from './Traversable' import { Applicative, Applicative1, Applicative2, Applicative2C, Applicative3, Applicative3C } from './Applicative' import { Filterable, Filterable1, Filterable2, Filterable2C, Filterable3 } from './Filterable' import { Either } from './Either' import { Separated } from './Compactable' /** * @category type classes * @since 2.0.0 */ export interface Witherable extends Traversable, Filterable { /** * Partition a structure with effects */ readonly wilt: Wilt /** * Filter a structure with effects */ readonly wither: Wither } /** * @category type classes * @since 2.0.0 */ export interface Witherable1 extends Traversable1, Filterable1 { readonly wilt: Wilt1 readonly wither: Wither1 } /** * @category type classes * @since 2.0.0 */ export interface Witherable2 extends Traversable2, Filterable2 { readonly wilt: Wilt2 readonly wither: Wither2 } /** * @category type classes * @since 2.0.0 */ export interface Witherable2C extends Traversable2C, Filterable2C { readonly wilt: Wilt2C readonly wither: Wither2C } /** * @category type classes * @since 2.0.0 */ export interface Witherable3 extends Traversable3, Filterable3 { readonly wilt: Wilt3 readonly wither: Wither3 } /** * @since 2.0.0 */ export interface Wither { (F: Applicative3): ( ta: HKT, f: (a: A) => Kind3> ) => Kind3> (F: Applicative3C): ( ta: HKT, f: (a: A) => Kind3> ) => Kind3> (F: Applicative2): ( ta: HKT, f: (a: A) => Kind2> ) => Kind2> (F: Applicative2C): ( ta: HKT, f: (a: A) => Kind2> ) => Kind2> (F: Applicative1): (ta: HKT, f: (a: A) => Kind>) => Kind> (F: Applicative): (ta: HKT, f: (a: A) => HKT>) => HKT> } /** * @since 2.0.0 */ export interface Wither1 { (F: Applicative3): ( ta: Kind, f: (a: A) => Kind3> ) => Kind3> (F: Applicative3C): ( ta: Kind, f: (a: A) => Kind3> ) => Kind3> (F: Applicative2): ( ta: Kind, f: (a: A) => Kind2> ) => Kind2> (F: Applicative2C): ( ta: Kind, f: (a: A) => Kind2> ) => Kind2> (F: Applicative1): (ta: Kind, f: (a: A) => Kind>) => Kind> (F: Applicative): (ta: Kind, f: (a: A) => HKT>) => HKT> } /** * @since 2.0.0 */ export interface Wither2 { (F: Applicative3): ( ta: Kind2, f: (a: A) => Kind3> ) => Kind3> (F: Applicative2): ( ta: Kind2, f: (a: A) => Kind2> ) => Kind2> (F: Applicative2C): ( ta: Kind2, f: (a: A) => Kind2> ) => Kind2> (F: Applicative1): ( ta: Kind2, f: (a: A) => Kind> ) => Kind> (F: Applicative): (ta: Kind2, f: (a: A) => HKT>) => HKT> } /** * @since 2.0.0 */ export interface Wither2C { (F: Applicative3): ( ta: Kind2, f: (a: A) => Kind3> ) => Kind3> (F: Applicative2): ( ta: Kind2, f: (a: A) => Kind2> ) => Kind2> (F: Applicative2C): ( ta: Kind2, f: (a: A) => Kind2> ) => Kind2> (F: Applicative1): ( ta: Kind2, f: (a: A) => Kind> ) => Kind> (F: Applicative): (ta: Kind2, f: (a: A) => HKT>) => HKT> } /** * @since 2.0.0 */ export interface Wither3 { (F: Applicative3): ( ta: Kind3, f: (a: A) => Kind3> ) => Kind3> (F: Applicative2): ( ta: Kind3, f: (a: A) => Kind2> ) => Kind2> (F: Applicative2C): ( ta: Kind3, f: (a: A) => Kind2> ) => Kind2> (F: Applicative1): ( ta: Kind3, f: (a: A) => Kind> ) => Kind> (F: Applicative): ( ta: Kind3, f: (a: A) => HKT> ) => HKT> } /** * @since 2.0.0 */ export interface Wilt { (F: Applicative3): ( wa: HKT, f: (a: A) => Kind3> ) => Kind3, HKT>> (F: Applicative3C): ( wa: HKT, f: (a: A) => Kind3> ) => Kind3, HKT>> (F: Applicative2): ( wa: HKT, f: (a: A) => Kind2> ) => Kind2, HKT>> (F: Applicative2C): ( wa: HKT, f: (a: A) => Kind2> ) => Kind2, HKT>> (F: Applicative1): ( wa: HKT, f: (a: A) => Kind> ) => Kind, HKT>> (F: Applicative): ( wa: HKT, f: (a: A) => HKT> ) => HKT, HKT>> } /** * @since 2.0.0 */ export interface Wilt1 { (F: Applicative3): ( wa: Kind, f: (a: A) => Kind3> ) => Kind3, Kind>> (F: Applicative3C): ( wa: Kind, f: (a: A) => Kind3> ) => Kind3, Kind>> (F: Applicative2): ( wa: Kind, f: (a: A) => Kind2> ) => Kind2, Kind>> (F: Applicative2C): ( wa: Kind, f: (a: A) => Kind2> ) => Kind2, Kind>> (F: Applicative1): ( wa: Kind, f: (a: A) => Kind> ) => Kind, Kind>> (F: Applicative): ( wa: Kind, f: (a: A) => HKT> ) => HKT, Kind>> } /** * @since 2.0.0 */ export interface Wilt2 { (F: Applicative3): ( wa: Kind2, f: (a: A) => Kind3> ) => Kind3, Kind2>> (F: Applicative2): ( wa: Kind2, f: (a: A) => Kind2> ) => Kind2, Kind2>> (F: Applicative2C): ( wa: Kind2, f: (a: A) => Kind2> ) => Kind2, Kind2>> (F: Applicative1): ( wa: Kind2, f: (a: A) => Kind> ) => Kind, Kind2>> (F: Applicative): ( wa: Kind2, f: (a: A) => HKT> ) => HKT, Kind2>> } /** * @since 2.0.0 */ export interface Wilt2C { (F: Applicative3): ( wa: Kind2, f: (a: A) => Kind3> ) => Kind3, Kind2>> (F: Applicative2): ( wa: Kind2, f: (a: A) => Kind2> ) => Kind2, Kind2>> (F: Applicative2C): ( wa: Kind2, f: (a: A) => Kind2> ) => Kind2, Kind2>> (F: Applicative1): ( wa: Kind2, f: (a: A) => Kind> ) => Kind, Kind2>> (F: Applicative): ( wa: Kind2, f: (a: A) => HKT> ) => HKT, Kind2>> } /** * @since 2.0.0 */ export interface Wilt3 { (F: Applicative3): ( wa: Kind3, f: (a: A) => Kind3> ) => Kind3, Kind3>> (F: Applicative2): ( wa: Kind3, f: (a: A) => Kind2> ) => Kind2, Kind3>> (F: Applicative2C): ( wa: Kind3, f: (a: A) => Kind2> ) => Kind2, Kind3>> (F: Applicative1): ( wa: Kind3, f: (a: A) => Kind> ) => Kind, Kind3>> (F: Applicative): ( wa: Kind3, f: (a: A) => HKT> ) => HKT, Kind3>> } /** * @since 2.6.5 */ export interface PipeableWither { (F: Applicative3): ( f: (a: A) => Kind3> ) => (ta: HKT) => Kind3> (F: Applicative3C): ( f: (a: A) => Kind3> ) => (ta: HKT) => Kind3> (F: Applicative2): ( f: (a: A) => Kind2> ) => (ta: HKT) => Kind2> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (ta: HKT) => Kind2> (F: Applicative1): (f: (a: A) => Kind>) => (ta: HKT) => Kind> (F: Applicative): (f: (a: A) => HKT>) => (ta: HKT) => HKT> } /** * @since 2.6.5 */ export interface PipeableWither1 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (ta: Kind) => Kind3> (F: Applicative3C): ( f: (a: A) => Kind3> ) => (ta: Kind) => Kind3> (F: Applicative2): ( f: (a: A) => Kind2> ) => (ta: Kind) => Kind2> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (ta: Kind) => Kind2> (F: Applicative1): ( f: (a: A) => Kind> ) => (ta: Kind) => Kind> (F: Applicative): (f: (a: A) => HKT>) => (ta: Kind) => HKT> } /** * @since 2.6.5 */ export interface PipeableWither2 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (ta: Kind2) => Kind3> (F: Applicative2): ( f: (a: A) => Kind2> ) => (ta: Kind2) => Kind2> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (ta: Kind2) => Kind2> (F: Applicative1): ( f: (a: A) => Kind> ) => (ta: Kind2) => Kind> (F: Applicative): (f: (a: A) => HKT>) => (ta: Kind2) => HKT> } /** * @since 2.6.5 */ export interface PipeableWither2C { (F: Applicative3): ( f: (a: A) => Kind3> ) => (ta: Kind2) => Kind3> (F: Applicative2): ( f: (a: A) => Kind2> ) => (ta: Kind2) => Kind2> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (ta: Kind2) => Kind2> (F: Applicative1): ( f: (a: A) => Kind> ) => (ta: Kind2) => Kind> (F: Applicative): (f: (a: A) => HKT>) => (ta: Kind2) => HKT> } /** * @since 2.6.5 */ export interface PipeableWither3 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (ta: Kind3) => Kind3> (F: Applicative2): ( f: (a: A) => Kind2> ) => (ta: Kind3) => Kind2> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (ta: Kind3) => Kind2> (F: Applicative1): ( f: (a: A) => Kind> ) => (ta: Kind3) => Kind> (F: Applicative): ( f: (a: A) => HKT> ) => (ta: Kind3) => HKT> } /** * @since 2.6.5 */ export interface PipeableWilt { (F: Applicative3): ( f: (a: A) => Kind3> ) => (wa: HKT) => Kind3, HKT>> (F: Applicative3C): ( f: (a: A) => Kind3> ) => (wa: HKT) => Kind3, HKT>> (F: Applicative2): ( f: (a: A) => Kind2> ) => (wa: HKT) => Kind2, HKT>> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (wa: HKT) => Kind2, HKT>> (F: Applicative1): ( f: (a: A) => Kind> ) => (wa: HKT) => Kind, HKT>> (F: Applicative): ( f: (a: A) => HKT> ) => (wa: HKT) => HKT, HKT>> } /** * @since 2.6.5 */ export interface PipeableWilt1 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (wa: Kind) => Kind3, Kind>> (F: Applicative3C): ( f: (a: A) => Kind3> ) => (wa: Kind) => Kind3, Kind>> (F: Applicative2): ( f: (a: A) => Kind2> ) => (wa: Kind) => Kind2, Kind>> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (wa: Kind) => Kind2, Kind>> (F: Applicative1): ( f: (a: A) => Kind> ) => (wa: Kind) => Kind, Kind>> (F: Applicative): ( f: (a: A) => HKT> ) => (wa: Kind) => HKT, Kind>> } /** * @since 2.6.5 */ export interface PipeableWilt2 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (wa: Kind2) => Kind3, Kind2>> (F: Applicative2): ( f: (a: A) => Kind2> ) => (wa: Kind2) => Kind2, Kind2>> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (wa: Kind2) => Kind2, Kind2>> (F: Applicative1): ( f: (a: A) => Kind> ) => (wa: Kind2) => Kind, Kind2>> (F: Applicative): ( f: (a: A) => HKT> ) => (wa: Kind2) => HKT, Kind2>> } /** * @since 2.6.5 */ export interface PipeableWilt2C { (F: Applicative3): ( f: (a: A) => Kind3> ) => (wa: Kind2) => Kind3, Kind2>> (F: Applicative2): ( f: (a: A) => Kind2> ) => (wa: Kind2) => Kind2, Kind2>> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (wa: Kind2) => Kind2, Kind2>> (F: Applicative1): ( f: (a: A) => Kind> ) => (wa: Kind2) => Kind, Kind2>> (F: Applicative): ( f: (a: A) => HKT> ) => (wa: Kind2) => HKT, Kind2>> } /** * @since 2.6.5 */ export interface PipeableWilt3 { (F: Applicative3): ( f: (a: A) => Kind3> ) => (wa: Kind3) => Kind3, Kind3>> (F: Applicative2): ( f: (a: A) => Kind2> ) => (wa: Kind3) => Kind2, Kind3>> (F: Applicative2C): ( f: (a: A) => Kind2> ) => (wa: Kind3) => Kind2, Kind3>> (F: Applicative1): ( f: (a: A) => Kind> ) => (wa: Kind3) => Kind, Kind3>> (F: Applicative): ( f: (a: A) => HKT> ) => (wa: Kind3) => HKT, Kind3>> }