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

193 строки
4.7 KiB

  1. import { pipe } from './function';
  2. import { flap as flap_ } from './Functor';
  3. // -------------------------------------------------------------------------------------
  4. // constructors
  5. // -------------------------------------------------------------------------------------
  6. /**
  7. * Appends a value to the accumulator
  8. *
  9. * @category constructors
  10. * @since 2.0.0
  11. */
  12. export var tell = function (w) { return function () { return [undefined, w]; }; };
  13. // -------------------------------------------------------------------------------------
  14. // combinators
  15. // -------------------------------------------------------------------------------------
  16. /**
  17. * Modifies the result to include the changes to the accumulator
  18. *
  19. * @since 2.0.0
  20. */
  21. export var listen = function (fa) { return function () {
  22. var _a = fa(), a = _a[0], w = _a[1];
  23. return [[a, w], w];
  24. }; };
  25. /**
  26. * Applies the returned function to the accumulator
  27. *
  28. * @since 2.0.0
  29. */
  30. export var pass = function (fa) { return function () {
  31. var _a = fa(), _b = _a[0], a = _b[0], f = _b[1], w = _a[1];
  32. return [a, f(w)];
  33. }; };
  34. /**
  35. * Projects a value from modifications made to the accumulator during an action
  36. *
  37. * @since 2.0.0
  38. */
  39. export var listens = function (f) { return function (fa) { return function () {
  40. var _a = fa(), a = _a[0], w = _a[1];
  41. return [[a, f(w)], w];
  42. }; }; };
  43. /**
  44. * Modify the final accumulator value by applying a function
  45. *
  46. * @since 2.0.0
  47. */
  48. export var censor = function (f) { return function (fa) { return function () {
  49. var _a = fa(), a = _a[0], w = _a[1];
  50. return [a, f(w)];
  51. }; }; };
  52. /* istanbul ignore next */
  53. var _map = function (fa, f) { return pipe(fa, map(f)); };
  54. /**
  55. * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
  56. * use the type constructor `F` to represent some computational context.
  57. *
  58. * @category mapping
  59. * @since 2.0.0
  60. */
  61. export var map = function (f) { return function (fa) { return function () {
  62. var _a = fa(), a = _a[0], w = _a[1];
  63. return [f(a), w];
  64. }; }; };
  65. /**
  66. * @category type lambdas
  67. * @since 2.0.0
  68. */
  69. export var URI = 'Writer';
  70. /**
  71. * @category instances
  72. * @since 2.10.0
  73. */
  74. export var getPointed = function (M) { return ({
  75. URI: URI,
  76. _E: undefined,
  77. of: function (a) { return function () { return [a, M.empty]; }; }
  78. }); };
  79. /**
  80. * @category instances
  81. * @since 2.10.0
  82. */
  83. export var getApply = function (S) { return ({
  84. URI: URI,
  85. _E: undefined,
  86. map: _map,
  87. ap: function (fab, fa) { return function () {
  88. var _a = fab(), f = _a[0], w1 = _a[1];
  89. var _b = fa(), a = _b[0], w2 = _b[1];
  90. return [f(a), S.concat(w1, w2)];
  91. }; }
  92. }); };
  93. /**
  94. * @category instances
  95. * @since 2.10.0
  96. */
  97. export var getApplicative = function (M) {
  98. var A = getApply(M);
  99. var P = getPointed(M);
  100. return {
  101. URI: URI,
  102. _E: undefined,
  103. map: _map,
  104. ap: A.ap,
  105. of: P.of
  106. };
  107. };
  108. /**
  109. * @category instances
  110. * @since 2.10.0
  111. */
  112. export function getChain(S) {
  113. var A = getApply(S);
  114. return {
  115. URI: URI,
  116. _E: undefined,
  117. map: _map,
  118. ap: A.ap,
  119. chain: function (fa, f) { return function () {
  120. var _a = fa(), a = _a[0], w1 = _a[1];
  121. var _b = f(a)(), b = _b[0], w2 = _b[1];
  122. return [b, S.concat(w1, w2)];
  123. }; }
  124. };
  125. }
  126. /**
  127. * @category instances
  128. * @since 2.0.0
  129. */
  130. export function getMonad(M) {
  131. var A = getApplicative(M);
  132. var C = getChain(M);
  133. return {
  134. URI: URI,
  135. _E: undefined,
  136. map: _map,
  137. ap: A.ap,
  138. of: A.of,
  139. chain: C.chain
  140. };
  141. }
  142. /**
  143. * @category instances
  144. * @since 2.7.0
  145. */
  146. export var Functor = {
  147. URI: URI,
  148. map: _map
  149. };
  150. /**
  151. * @category mapping
  152. * @since 2.10.0
  153. */
  154. export var flap = /*#__PURE__*/ flap_(Functor);
  155. // -------------------------------------------------------------------------------------
  156. // utils
  157. // -------------------------------------------------------------------------------------
  158. /**
  159. * @since 2.8.0
  160. */
  161. export var evaluate = function (fa) { return fa()[0]; };
  162. /**
  163. * @since 2.8.0
  164. */
  165. export var execute = function (fa) { return fa()[1]; };
  166. // -------------------------------------------------------------------------------------
  167. // deprecated
  168. // -------------------------------------------------------------------------------------
  169. /**
  170. * Use [`evaluate`](#evaluate) instead
  171. *
  172. * @category zone of death
  173. * @since 2.0.0
  174. * @deprecated
  175. */
  176. export var evalWriter = function (fa) { return fa()[0]; };
  177. /**
  178. * Use [`execute`](#execute) instead
  179. *
  180. * @category zone of death
  181. * @since 2.0.0
  182. * @deprecated
  183. */
  184. export var execWriter = function (fa) { return fa()[1]; };
  185. /**
  186. * Use [`Functor`](#functor) instead.
  187. *
  188. * @category zone of death
  189. * @since 2.0.0
  190. * @deprecated
  191. */
  192. export var writer = Functor;