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

330 строки
7.1 KiB

  1. import { identity, pipe } from './function';
  2. import { flap as flap_ } from './Functor';
  3. // -------------------------------------------------------------------------------------
  4. // model
  5. // -------------------------------------------------------------------------------------
  6. /**
  7. * @since 2.5.0
  8. */
  9. export function fst(ea) {
  10. return ea[0];
  11. }
  12. /**
  13. * @since 2.5.0
  14. */
  15. export function snd(ea) {
  16. return ea[1];
  17. }
  18. /**
  19. * @since 2.5.0
  20. */
  21. export var swap = function (ea) { return [snd(ea), fst(ea)]; };
  22. /**
  23. * @category instances
  24. * @since 2.5.0
  25. */
  26. export function getApply(S) {
  27. return {
  28. URI: URI,
  29. _E: undefined,
  30. map: _map,
  31. ap: function (fab, fa) { return [fst(fab)(fst(fa)), S.concat(snd(fab), snd(fa))]; }
  32. };
  33. }
  34. var of = function (M) {
  35. return function (a) {
  36. return [a, M.empty];
  37. };
  38. };
  39. /**
  40. * @category instances
  41. * @since 2.5.0
  42. */
  43. export function getApplicative(M) {
  44. var A = getApply(M);
  45. return {
  46. URI: URI,
  47. _E: undefined,
  48. map: _map,
  49. ap: A.ap,
  50. of: of(M)
  51. };
  52. }
  53. /**
  54. * @category instances
  55. * @since 2.5.0
  56. */
  57. export function getChain(S) {
  58. var A = getApply(S);
  59. return {
  60. URI: URI,
  61. _E: undefined,
  62. map: _map,
  63. ap: A.ap,
  64. chain: function (ma, f) {
  65. var _a = f(fst(ma)), b = _a[0], s = _a[1];
  66. return [b, S.concat(snd(ma), s)];
  67. }
  68. };
  69. }
  70. /**
  71. * @category instances
  72. * @since 2.5.0
  73. */
  74. export function getMonad(M) {
  75. var C = getChain(M);
  76. return {
  77. URI: URI,
  78. _E: undefined,
  79. map: _map,
  80. ap: C.ap,
  81. chain: C.chain,
  82. of: of(M)
  83. };
  84. }
  85. /**
  86. * @category instances
  87. * @since 2.5.0
  88. */
  89. export function getChainRec(M) {
  90. var chainRec = function (a, f) {
  91. var result = f(a);
  92. var acc = M.empty;
  93. var s = fst(result);
  94. while (s._tag === 'Left') {
  95. acc = M.concat(acc, snd(result));
  96. result = f(s.left);
  97. s = fst(result);
  98. }
  99. return [s.right, M.concat(acc, snd(result))];
  100. };
  101. var C = getChain(M);
  102. return {
  103. URI: URI,
  104. _E: undefined,
  105. map: _map,
  106. ap: C.ap,
  107. chain: C.chain,
  108. chainRec: chainRec
  109. };
  110. }
  111. /* istanbul ignore next */
  112. var _compose = function (bc, ab) { return pipe(bc, compose(ab)); };
  113. /* istanbul ignore next */
  114. var _map = function (fa, f) { return pipe(fa, mapFst(f)); };
  115. /* istanbul ignore next */
  116. var _bimap = function (fa, f, g) { return pipe(fa, bimap(f, g)); };
  117. /* istanbul ignore next */
  118. var _mapLeft = function (fa, f) { return pipe(fa, mapSnd(f)); };
  119. /* istanbul ignore next */
  120. var _extend = function (wa, f) { return pipe(wa, extend(f)); };
  121. /* istanbul ignore next */
  122. var _reduce = function (fa, b, f) { return pipe(fa, reduce(b, f)); };
  123. /* istanbul ignore next */
  124. var _foldMap = function (M) {
  125. var foldMapM = foldMap(M);
  126. return function (fa, f) { return pipe(fa, foldMapM(f)); };
  127. };
  128. /* istanbul ignore next */
  129. var _reduceRight = function (fa, b, f) { return pipe(fa, reduceRight(b, f)); };
  130. /* istanbul ignore next */
  131. var _traverse = function (F) {
  132. var traverseF = traverse(F);
  133. return function (ta, f) { return pipe(ta, traverseF(f)); };
  134. };
  135. /**
  136. * Map a pair of functions over the two type arguments of the bifunctor.
  137. *
  138. * @category mapping
  139. * @since 2.5.0
  140. */
  141. export var bimap = function (f, g) { return function (fa) { return [g(fst(fa)), f(snd(fa))]; }; };
  142. /**
  143. * Map a function over the first component of a `ReadonlyTuple`.
  144. *
  145. * This is the `map` operation of the `Functor` instance.
  146. *
  147. * @category mapping
  148. * @since 2.10.0
  149. */
  150. export var mapFst = function (f) { return function (fa) {
  151. return [f(fst(fa)), snd(fa)];
  152. }; };
  153. /**
  154. * Map a function over the second component of a `ReadonlyTuple`.
  155. *
  156. * This is the `mapLeft` operation of the `Bifunctor` instance.
  157. *
  158. * @category mapping
  159. * @since 2.10.0
  160. */
  161. export var mapSnd = function (f) { return function (fa) {
  162. return [fst(fa), f(snd(fa))];
  163. }; };
  164. /**
  165. * @since 2.5.0
  166. */
  167. export var compose = function (ab) { return function (bc) {
  168. return [fst(bc), snd(ab)];
  169. }; };
  170. /**
  171. * @since 2.5.0
  172. */
  173. export var extend = function (f) { return function (wa) {
  174. return [f(wa), snd(wa)];
  175. }; };
  176. /**
  177. * @category Extract
  178. * @since 2.6.2
  179. */
  180. export var extract = fst;
  181. /**
  182. * @since 2.5.0
  183. */
  184. export var duplicate = /*#__PURE__*/ extend(identity);
  185. /**
  186. * @category folding
  187. * @since 2.5.0
  188. */
  189. export var reduce = function (b, f) { return function (fa) {
  190. return f(b, fst(fa));
  191. }; };
  192. /**
  193. * @category folding
  194. * @since 2.5.0
  195. */
  196. export var foldMap = function () {
  197. return function (f) { return function (fa) { return f(fst(fa)); }; };
  198. };
  199. /**
  200. * @category folding
  201. * @since 2.5.0
  202. */
  203. export var reduceRight = function (b, f) { return function (fa) {
  204. return f(fst(fa), b);
  205. }; };
  206. /**
  207. * @category traversing
  208. * @since 2.6.3
  209. */
  210. export var traverse = function (F) {
  211. return function (f) { return function (ta) { return F.map(f(fst(ta)), function (b) { return [b, snd(ta)]; }); }; };
  212. };
  213. /**
  214. * @category traversing
  215. * @since 2.6.3
  216. */
  217. export var sequence = function (F) {
  218. return function (fas) {
  219. return F.map(fst(fas), function (a) { return [a, snd(fas)]; });
  220. };
  221. };
  222. /**
  223. * @category type lambdas
  224. * @since 2.5.0
  225. */
  226. export var URI = 'ReadonlyTuple';
  227. /**
  228. * @category instances
  229. * @since 2.7.0
  230. */
  231. export var Functor = {
  232. URI: URI,
  233. map: _map
  234. };
  235. /**
  236. * @category mapping
  237. * @since 2.10.0
  238. */
  239. export var flap = /*#__PURE__*/ flap_(Functor);
  240. /**
  241. * Alias of [`mapFst`](#mapfst).
  242. *
  243. * @category mapping
  244. * @since 2.5.0
  245. */
  246. export var map = mapFst;
  247. /**
  248. * Alias of [`mapSnd`](#mapsnd).
  249. *
  250. * @category error handling
  251. * @since 2.5.0
  252. */
  253. export var mapLeft = mapSnd;
  254. /**
  255. * @category instances
  256. * @since 2.7.0
  257. */
  258. export var Bifunctor = {
  259. URI: URI,
  260. bimap: _bimap,
  261. mapLeft: _mapLeft
  262. };
  263. /**
  264. * @category instances
  265. * @since 2.7.0
  266. */
  267. export var Semigroupoid = {
  268. URI: URI,
  269. compose: _compose
  270. };
  271. /**
  272. * @category instances
  273. * @since 2.7.0
  274. */
  275. export var Comonad = {
  276. URI: URI,
  277. map: _map,
  278. extend: _extend,
  279. extract: extract
  280. };
  281. /**
  282. * @category instances
  283. * @since 2.7.0
  284. */
  285. export var Foldable = {
  286. URI: URI,
  287. reduce: _reduce,
  288. foldMap: _foldMap,
  289. reduceRight: _reduceRight
  290. };
  291. /**
  292. * @category instances
  293. * @since 2.7.0
  294. */
  295. export var Traversable = {
  296. URI: URI,
  297. map: _map,
  298. reduce: _reduce,
  299. foldMap: _foldMap,
  300. reduceRight: _reduceRight,
  301. traverse: _traverse,
  302. sequence: sequence
  303. };
  304. // -------------------------------------------------------------------------------------
  305. // deprecated
  306. // -------------------------------------------------------------------------------------
  307. /**
  308. * This instance is deprecated, use small, specific instances instead.
  309. * For example if a function needs a `Functor` instance, pass `RT.Functor` instead of `RT.readonlyTuple`
  310. * (where `RT` is from `import RT from 'fp-ts/ReadonlyTuple'`)
  311. *
  312. * @category zone of death
  313. * @since 2.5.0
  314. * @deprecated
  315. */
  316. export var readonlyTuple = {
  317. URI: URI,
  318. compose: _compose,
  319. map: _map,
  320. bimap: _bimap,
  321. mapLeft: _mapLeft,
  322. extract: extract,
  323. extend: _extend,
  324. reduce: _reduce,
  325. foldMap: _foldMap,
  326. reduceRight: _reduceRight,
  327. traverse: _traverse,
  328. sequence: sequence
  329. };