版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

173 строки
5.0 KiB

  1. /**
  2. * The `Chain` type class extends the `Apply` type class with a `chain` operation which composes computations in
  3. * sequence, using the return value of one computation to determine the next computation.
  4. *
  5. * Instances must satisfy the following law in addition to the `Apply` laws:
  6. *
  7. * 1. Associativity: `F.chain(F.chain(fa, afb), bfc) <-> F.chain(fa, a => F.chain(afb(a), bfc))`
  8. *
  9. * Note. `Apply`'s `ap` can be derived: `(fab, fa) => F.chain(fab, f => F.map(fa, f))`
  10. *
  11. * @since 2.0.0
  12. */
  13. import { Apply, Apply1, Apply2, Apply2C, Apply3, Apply4, Apply3C } from './Apply'
  14. import { HKT, Kind, Kind2, Kind3, Kind4, URIS, URIS2, URIS3, URIS4 } from './HKT'
  15. /**
  16. * @category model
  17. * @since 2.0.0
  18. */
  19. export interface Chain<F> extends Apply<F> {
  20. readonly chain: <A, B>(fa: HKT<F, A>, f: (a: A) => HKT<F, B>) => HKT<F, B>
  21. }
  22. /**
  23. * @category model
  24. * @since 2.0.0
  25. */
  26. export interface Chain1<F extends URIS> extends Apply1<F> {
  27. readonly chain: <A, B>(fa: Kind<F, A>, f: (a: A) => Kind<F, B>) => Kind<F, B>
  28. }
  29. /**
  30. * @category model
  31. * @since 2.0.0
  32. */
  33. export interface Chain2<F extends URIS2> extends Apply2<F> {
  34. readonly chain: <E, A, B>(fa: Kind2<F, E, A>, f: (a: A) => Kind2<F, E, B>) => Kind2<F, E, B>
  35. }
  36. /**
  37. * @category model
  38. * @since 2.0.0
  39. */
  40. export interface Chain2C<F extends URIS2, E> extends Apply2C<F, E> {
  41. readonly chain: <A, B>(fa: Kind2<F, E, A>, f: (a: A) => Kind2<F, E, B>) => Kind2<F, E, B>
  42. }
  43. /**
  44. * @category model
  45. * @since 2.0.0
  46. */
  47. export interface Chain3<F extends URIS3> extends Apply3<F> {
  48. readonly chain: <R, E, A, B>(fa: Kind3<F, R, E, A>, f: (a: A) => Kind3<F, R, E, B>) => Kind3<F, R, E, B>
  49. }
  50. /**
  51. * @category model
  52. * @since 2.2.0
  53. */
  54. export interface Chain3C<F extends URIS3, E> extends Apply3C<F, E> {
  55. readonly chain: <R, A, B>(fa: Kind3<F, R, E, A>, f: (a: A) => Kind3<F, R, E, B>) => Kind3<F, R, E, B>
  56. }
  57. /**
  58. * @category model
  59. * @since 2.0.0
  60. */
  61. export interface Chain4<F extends URIS4> extends Apply4<F> {
  62. readonly chain: <S, R, E, A, B>(fa: Kind4<F, S, R, E, A>, f: (a: A) => Kind4<F, S, R, E, B>) => Kind4<F, S, R, E, B>
  63. }
  64. /**
  65. * @since 2.10.0
  66. */
  67. export declare function chainFirst<M extends URIS4>(
  68. M: Chain4<M>
  69. ): <A, S, R, E, B>(f: (a: A) => Kind4<M, S, R, E, B>) => (first: Kind4<M, S, R, E, A>) => Kind4<M, S, R, E, A>
  70. export declare function chainFirst<M extends URIS3>(
  71. M: Chain3<M>
  72. ): <A, R, E, B>(f: (a: A) => Kind3<M, R, E, B>) => (first: Kind3<M, R, E, A>) => Kind3<M, R, E, A>
  73. export declare function chainFirst<M extends URIS3, E>(
  74. M: Chain3C<M, E>
  75. ): <A, R, B>(f: (a: A) => Kind3<M, R, E, B>) => (first: Kind3<M, R, E, A>) => Kind3<M, R, E, A>
  76. export declare function chainFirst<M extends URIS2>(
  77. M: Chain2<M>
  78. ): <A, E, B>(f: (a: A) => Kind2<M, E, B>) => (first: Kind2<M, E, A>) => Kind2<M, E, A>
  79. export declare function chainFirst<M extends URIS2, E>(
  80. M: Chain2C<M, E>
  81. ): <A, B>(f: (a: A) => Kind2<M, E, B>) => (first: Kind2<M, E, A>) => Kind2<M, E, A>
  82. export declare function chainFirst<M extends URIS>(
  83. M: Chain1<M>
  84. ): <A, B>(f: (a: A) => Kind<M, B>) => (first: Kind<M, A>) => Kind<M, A>
  85. export declare function chainFirst<M>(M: Chain<M>): <A, B>(f: (a: A) => HKT<M, B>) => (first: HKT<M, A>) => HKT<M, A>
  86. /**
  87. * @since 2.10.0
  88. */
  89. export declare function bind<M extends URIS4>(
  90. M: Chain4<M>
  91. ): <N extends string, A, S, R, E, B>(
  92. name: Exclude<N, keyof A>,
  93. f: (a: A) => Kind4<M, S, R, E, B>
  94. ) => (ma: Kind4<M, S, R, E, A>) => Kind4<
  95. M,
  96. S,
  97. R,
  98. E,
  99. {
  100. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  101. }
  102. >
  103. export declare function bind<M extends URIS3>(
  104. M: Chain3<M>
  105. ): <N extends string, A, R, E, B>(
  106. name: Exclude<N, keyof A>,
  107. f: (a: A) => Kind3<M, R, E, B>
  108. ) => (ma: Kind3<M, R, E, A>) => Kind3<
  109. M,
  110. R,
  111. E,
  112. {
  113. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  114. }
  115. >
  116. export declare function bind<M extends URIS3, E>(
  117. M: Chain3C<M, E>
  118. ): <N extends string, A, R, B>(
  119. name: Exclude<N, keyof A>,
  120. f: (a: A) => Kind3<M, R, E, B>
  121. ) => (ma: Kind3<M, R, E, A>) => Kind3<
  122. M,
  123. R,
  124. E,
  125. {
  126. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  127. }
  128. >
  129. export declare function bind<M extends URIS2>(
  130. M: Chain2<M>
  131. ): <N extends string, A, E, B>(
  132. name: Exclude<N, keyof A>,
  133. f: (a: A) => Kind2<M, E, B>
  134. ) => (ma: Kind2<M, E, A>) => Kind2<
  135. M,
  136. E,
  137. {
  138. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  139. }
  140. >
  141. export declare function bind<M extends URIS2, E>(
  142. M: Chain2C<M, E>
  143. ): <N extends string, A, B>(
  144. name: Exclude<N, keyof A>,
  145. f: (a: A) => Kind2<M, E, B>
  146. ) => (ma: Kind2<M, E, A>) => Kind2<
  147. M,
  148. E,
  149. {
  150. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  151. }
  152. >
  153. export declare function bind<M extends URIS>(
  154. M: Chain1<M>
  155. ): <N extends string, A, B>(
  156. name: Exclude<N, keyof A>,
  157. f: (a: A) => Kind<M, B>
  158. ) => (ma: Kind<M, A>) => Kind<
  159. M,
  160. {
  161. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  162. }
  163. >
  164. export declare function bind<M>(M: Chain<M>): <N extends string, A, B>(
  165. name: Exclude<N, keyof A>,
  166. f: (a: A) => HKT<M, B>
  167. ) => (ma: HKT<M, A>) => HKT<
  168. M,
  169. {
  170. readonly [K in keyof A | N]: K extends keyof A ? A[K] : B
  171. }
  172. >