版博士V2.0程序
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

321 líneas
11 KiB

  1. /**
  2. * `Compactable` represents data structures which can be _compacted_/_filtered_. This is a generalization of
  3. * `catOptions` as a new function `compact`. `compact` has relations with `Functor`, `Applicative`,
  4. * `Monad`, `Alternative`, and `Traversable` in that we can use these classes to provide the ability to
  5. * operate on a data type by eliminating intermediate `None`s. This is useful for representing the filtering out of
  6. * values, or failure.
  7. *
  8. * Adapted from https://github.com/LiamGoodacre/purescript-filterable/blob/master/src/Data/Compactable.purs
  9. *
  10. * @since 2.0.0
  11. */
  12. import { Either } from './Either'
  13. import {
  14. Functor,
  15. Functor1,
  16. Functor2,
  17. Functor2C,
  18. Functor3C,
  19. FunctorComposition,
  20. FunctorComposition11,
  21. FunctorComposition12,
  22. FunctorComposition12C,
  23. FunctorComposition21,
  24. FunctorComposition22,
  25. FunctorComposition22C,
  26. FunctorComposition23,
  27. FunctorComposition23C,
  28. FunctorComposition2C1
  29. } from './Functor'
  30. import { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from './HKT'
  31. import { Option } from './Option'
  32. import * as S from './Separated'
  33. /**
  34. * @category model
  35. * @since 2.0.0
  36. */
  37. export interface Compactable<F> {
  38. readonly URI: F
  39. /**
  40. * Compacts a data structure unwrapping inner Option
  41. */
  42. readonly compact: <A>(fa: HKT<F, Option<A>>) => HKT<F, A>
  43. /**
  44. * Separates a data structure moving inner Left to the left side and inner Right to the right side of Separated
  45. */
  46. readonly separate: <A, B>(fa: HKT<F, Either<A, B>>) => S.Separated<HKT<F, A>, HKT<F, B>>
  47. }
  48. /**
  49. * @category model
  50. * @since 2.0.0
  51. */
  52. export interface Compactable1<F extends URIS> {
  53. readonly URI: F
  54. readonly compact: <A>(fa: Kind<F, Option<A>>) => Kind<F, A>
  55. readonly separate: <A, B>(fa: Kind<F, Either<A, B>>) => S.Separated<Kind<F, A>, Kind<F, B>>
  56. }
  57. /**
  58. * @category model
  59. * @since 2.0.0
  60. */
  61. export interface Compactable2<F extends URIS2> {
  62. readonly URI: F
  63. readonly compact: <E, A>(fa: Kind2<F, E, Option<A>>) => Kind2<F, E, A>
  64. readonly separate: <E, A, B>(fa: Kind2<F, E, Either<A, B>>) => S.Separated<Kind2<F, E, A>, Kind2<F, E, B>>
  65. }
  66. /**
  67. * @category model
  68. * @since 2.0.0
  69. */
  70. export interface Compactable2C<F extends URIS2, E> {
  71. readonly URI: F
  72. readonly _E: E
  73. readonly compact: <A>(fa: Kind2<F, E, Option<A>>) => Kind2<F, E, A>
  74. readonly separate: <A, B>(fa: Kind2<F, E, Either<A, B>>) => S.Separated<Kind2<F, E, A>, Kind2<F, E, B>>
  75. }
  76. /**
  77. * @category model
  78. * @since 2.0.0
  79. */
  80. export interface Compactable3<F extends URIS3> {
  81. readonly URI: F
  82. readonly compact: <R, E, A>(fa: Kind3<F, R, E, Option<A>>) => Kind3<F, R, E, A>
  83. readonly separate: <R, E, A, B>(fa: Kind3<F, R, E, Either<A, B>>) => S.Separated<Kind3<F, R, E, A>, Kind3<F, R, E, B>>
  84. }
  85. /**
  86. * @category model
  87. * @since 2.2.0
  88. */
  89. export interface Compactable3C<F extends URIS3, E> {
  90. readonly URI: F
  91. readonly _E: E
  92. readonly compact: <R, A>(fa: Kind3<F, R, E, Option<A>>) => Kind3<F, R, E, A>
  93. readonly separate: <R, A, B>(fa: Kind3<F, R, E, Either<A, B>>) => S.Separated<Kind3<F, R, E, A>, Kind3<F, R, E, B>>
  94. }
  95. /**
  96. * @category model
  97. * @since 2.0.0
  98. */
  99. export interface Compactable4<F extends URIS4> {
  100. readonly URI: F
  101. readonly compact: <S, R, E, A>(fa: Kind4<F, S, R, E, Option<A>>) => Kind4<F, S, R, E, A>
  102. readonly separate: <S, R, E, A, B>(
  103. fa: Kind4<F, S, R, E, Either<A, B>>
  104. ) => S.Separated<Kind4<F, S, R, E, A>, Kind4<F, S, R, E, B>>
  105. }
  106. /**
  107. * `compact` composition.
  108. *
  109. * @since 2.10.0
  110. */
  111. export declare function compact<F extends URIS2, G extends URIS2, E>(
  112. F: Functor2<F>,
  113. G: Compactable2C<G, E>
  114. ): <FE, A>(fa: Kind2<F, FE, Kind2<G, E, Option<A>>>) => Kind2<F, FE, Kind2<G, E, A>>
  115. export declare function compact<F extends URIS, G extends URIS2, E>(
  116. F: Functor1<F>,
  117. G: Compactable2C<G, E>
  118. ): <A>(fa: Kind<F, Kind2<G, E, Option<A>>>) => Kind<F, Kind2<G, E, A>>
  119. export declare function compact<F extends URIS, G extends URIS>(
  120. F: Functor1<F>,
  121. G: Compactable1<G>
  122. ): <A>(fa: Kind<F, Kind<G, Option<A>>>) => Kind<F, Kind<G, A>>
  123. export declare function compact<F, G>(
  124. F: Functor<F>,
  125. G: Compactable<G>
  126. ): <A>(fa: HKT<F, HKT<G, Option<A>>>) => HKT<F, HKT<G, A>>
  127. /**
  128. * `separate` composition.
  129. *
  130. * @since 2.10.0
  131. */
  132. export declare function separate<F extends URIS2, G extends URIS2, E>(
  133. F: Functor2<F>,
  134. C: Compactable2C<G, E>,
  135. G: Functor2<G>
  136. ): <FE, A, B>(
  137. fge: Kind2<F, FE, Kind2<G, E, Either<A, B>>>
  138. ) => S.Separated<Kind2<F, FE, Kind2<G, E, A>>, Kind2<F, FE, Kind2<G, E, B>>>
  139. export declare function separate<F extends URIS, G extends URIS2, E>(
  140. F: Functor1<F>,
  141. C: Compactable2C<G, E>,
  142. G: Functor2<G>
  143. ): <A, B>(fge: Kind<F, Kind2<G, E, Either<A, B>>>) => S.Separated<Kind<F, Kind2<G, E, A>>, Kind<F, Kind2<G, E, B>>>
  144. export declare function separate<F extends URIS, G extends URIS>(
  145. F: Functor1<F>,
  146. C: Compactable1<G>,
  147. G: Functor1<G>
  148. ): <A, B>(fge: Kind<F, Kind<G, Either<A, B>>>) => S.Separated<Kind<F, Kind<G, A>>, Kind<F, Kind<G, B>>>
  149. export declare function separate<F, G>(
  150. F: Functor<F>,
  151. C: Compactable<G>,
  152. G: Functor<G>
  153. ): <A, B>(fge: HKT<F, HKT<G, Either<A, B>>>) => S.Separated<HKT<F, HKT<G, A>>, HKT<F, HKT<G, B>>>
  154. /**
  155. * @category zone of death
  156. * @since 2.0.0
  157. * @deprecated
  158. */
  159. export interface CompactableComposition<F, G> extends FunctorComposition<F, G> {
  160. readonly compact: <A>(fga: HKT<F, HKT<G, Option<A>>>) => HKT<F, HKT<G, A>>
  161. readonly separate: <A, B>(fge: HKT<F, HKT<G, Either<A, B>>>) => Separated<HKT<F, HKT<G, A>>, HKT<F, HKT<G, B>>>
  162. }
  163. /**
  164. * @category zone of death
  165. * @since 2.0.0
  166. * @deprecated
  167. */
  168. export interface CompactableComposition11<F extends URIS, G extends URIS> extends FunctorComposition11<F, G> {
  169. readonly compact: <A>(fga: Kind<F, Kind<G, Option<A>>>) => Kind<F, Kind<G, A>>
  170. readonly separate: <A, B>(fge: Kind<F, Kind<G, Either<A, B>>>) => Separated<Kind<F, Kind<G, A>>, Kind<F, Kind<G, B>>>
  171. }
  172. /**
  173. * @category zone of death
  174. * @since 2.0.0
  175. * @deprecated
  176. */
  177. export interface CompactableComposition12<F extends URIS, G extends URIS2> extends FunctorComposition12<F, G> {
  178. readonly compact: <E, A>(fga: Kind<F, Kind2<G, E, Option<A>>>) => Kind<F, Kind2<G, E, A>>
  179. readonly separate: <E, A, B>(
  180. fge: Kind<F, Kind2<G, E, Either<A, B>>>
  181. ) => Separated<Kind<F, Kind2<G, E, A>>, Kind<F, Kind2<G, E, B>>>
  182. }
  183. /**
  184. * @category zone of death
  185. * @since 2.0.0
  186. * @deprecated
  187. */
  188. export interface CompactableComposition12C<F extends URIS, G extends URIS2, E> extends FunctorComposition12C<F, G, E> {
  189. readonly compact: <A>(fga: Kind<F, Kind2<G, E, Option<A>>>) => Kind<F, Kind2<G, E, A>>
  190. readonly separate: <A, B>(
  191. fge: Kind<F, Kind2<G, E, Either<A, B>>>
  192. ) => Separated<Kind<F, Kind2<G, E, A>>, Kind<F, Kind2<G, E, B>>>
  193. }
  194. /**
  195. * @category zone of death
  196. * @since 2.0.0
  197. * @deprecated
  198. */
  199. export interface CompactableComposition21<F extends URIS2, G extends URIS> extends FunctorComposition21<F, G> {
  200. readonly compact: <FE, A>(fga: Kind2<F, FE, Kind<G, Option<A>>>) => Kind2<F, FE, Kind<G, A>>
  201. readonly separate: <FE, A, B>(
  202. fge: Kind2<F, FE, Kind<G, Either<A, B>>>
  203. ) => Separated<Kind2<F, FE, Kind<G, A>>, Kind2<F, FE, Kind<G, B>>>
  204. }
  205. /**
  206. * @category zone of death
  207. * @since 2.0.0
  208. * @deprecated
  209. */
  210. export interface CompactableComposition2C1<F extends URIS2, G extends URIS, E> extends FunctorComposition2C1<F, G, E> {
  211. readonly compact: <A>(fga: Kind2<F, E, Kind<G, Option<A>>>) => Kind2<F, E, Kind<G, A>>
  212. readonly separate: <A, B>(
  213. fge: Kind2<F, E, Kind<G, Either<A, B>>>
  214. ) => Separated<Kind2<F, E, Kind<G, A>>, Kind2<F, E, Kind<G, B>>>
  215. }
  216. /**
  217. * @category zone of death
  218. * @since 2.0.0
  219. * @deprecated
  220. */
  221. export interface CompactableComposition22<F extends URIS2, G extends URIS2> extends FunctorComposition22<F, G> {
  222. readonly compact: <FE, GE, A>(fga: Kind2<F, FE, Kind2<G, GE, Option<A>>>) => Kind2<F, FE, Kind2<G, GE, A>>
  223. readonly separate: <FE, GE, A, B>(
  224. fge: Kind2<F, FE, Kind2<G, GE, Either<A, B>>>
  225. ) => Separated<Kind2<F, FE, Kind2<G, GE, A>>, Kind2<F, FE, Kind2<G, GE, B>>>
  226. }
  227. /**
  228. * @category zone of death
  229. * @since 2.0.0
  230. * @deprecated
  231. */
  232. export interface CompactableComposition22C<F extends URIS2, G extends URIS2, E> extends FunctorComposition22C<F, G, E> {
  233. readonly compact: <FE, A>(fga: Kind2<F, FE, Kind2<G, E, Option<A>>>) => Kind2<F, FE, Kind2<G, E, A>>
  234. readonly separate: <FE, A, B>(
  235. fge: Kind2<F, FE, Kind2<G, E, Either<A, B>>>
  236. ) => Separated<Kind2<F, FE, Kind2<G, E, A>>, Kind2<F, FE, Kind2<G, E, B>>>
  237. }
  238. /**
  239. * @category zone of death
  240. * @since 2.2.0
  241. * @deprecated
  242. */
  243. export interface CompactableComposition23<F extends URIS2, G extends URIS3> extends FunctorComposition23<F, G> {
  244. readonly compact: <R, FE, GE, A>(fga: Kind2<F, FE, Kind3<G, R, GE, Option<A>>>) => Kind2<F, FE, Kind3<G, R, GE, A>>
  245. readonly separate: <R, FE, GE, A, B>(
  246. fge: Kind2<F, FE, Kind3<G, R, GE, Either<A, B>>>
  247. ) => Separated<Kind2<F, FE, Kind3<G, R, GE, A>>, Kind2<F, FE, Kind3<G, R, GE, B>>>
  248. }
  249. /**
  250. * @category zone of death
  251. * @since 2.2.0
  252. * @deprecated
  253. */
  254. export interface CompactableComposition23C<F extends URIS2, G extends URIS3, E> extends FunctorComposition23C<F, G, E> {
  255. readonly compact: <FE, R, A>(fga: Kind2<F, FE, Kind3<G, R, E, Option<A>>>) => Kind2<F, FE, Kind3<G, R, E, A>>
  256. readonly separate: <FE, R, A, B>(
  257. fge: Kind2<F, FE, Kind3<G, R, E, Either<A, B>>>
  258. ) => Separated<Kind2<F, FE, Kind3<G, R, E, A>>, Kind2<F, FE, Kind3<G, R, E, B>>>
  259. }
  260. /**
  261. * Use [`compact`](#compact) and [`separate`](#separate) instead.
  262. *
  263. * @category zone of death
  264. * @since 2.0.0
  265. * @deprecated
  266. */
  267. export declare function getCompactableComposition<F extends URIS2, G extends URIS3, E>(
  268. F: Functor2<F>,
  269. G: Compactable3C<G, E> & Functor3C<G, E>
  270. ): CompactableComposition23C<F, G, E>
  271. /** @deprecated */
  272. export declare function getCompactableComposition<F extends URIS2, G extends URIS2, E>(
  273. F: Functor2<F>,
  274. G: Compactable2C<G, E> & Functor2C<G, E>
  275. ): CompactableComposition22C<F, G, E>
  276. /** @deprecated */
  277. export declare function getCompactableComposition<F extends URIS2, G extends URIS2>(
  278. F: Functor2<F>,
  279. G: Compactable2<G> & Functor2<G>
  280. ): CompactableComposition22<F, G>
  281. /** @deprecated */
  282. export declare function getCompactableComposition<F extends URIS2, G extends URIS, E>(
  283. F: Functor2C<F, E>,
  284. G: Compactable1<G> & Functor1<G>
  285. ): CompactableComposition2C1<F, G, E>
  286. /** @deprecated */
  287. export declare function getCompactableComposition<F extends URIS2, G extends URIS>(
  288. F: Functor2<F>,
  289. G: Compactable1<G> & Functor1<G>
  290. ): CompactableComposition21<F, G>
  291. /** @deprecated */
  292. export declare function getCompactableComposition<F extends URIS, G extends URIS2, E>(
  293. F: Functor1<F>,
  294. G: Compactable2C<G, E> & Functor2C<G, E>
  295. ): CompactableComposition12<F, G>
  296. /** @deprecated */
  297. export declare function getCompactableComposition<F extends URIS, G extends URIS2>(
  298. F: Functor1<F>,
  299. G: Compactable2<G> & Functor2<G>
  300. ): CompactableComposition12<F, G>
  301. /** @deprecated */
  302. export declare function getCompactableComposition<F extends URIS, G extends URIS>(
  303. F: Functor1<F>,
  304. G: Compactable1<G> & Functor1<G>
  305. ): CompactableComposition11<F, G>
  306. /** @deprecated */
  307. export declare function getCompactableComposition<F, G>(
  308. F: Functor<F>,
  309. G: Compactable<G> & Functor<G>
  310. ): CompactableComposition<F, G>
  311. /**
  312. * Use [`Separated`](./Separated.ts.html#separated) instead.
  313. *
  314. * @since 2.0.0
  315. * @deprecated
  316. */
  317. export interface Separated<A, B> {
  318. readonly left: A
  319. readonly right: B
  320. }