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

98 строки
2.3 KiB

  1. /**
  2. * ```ts
  3. * interface Separated<E, A> {
  4. * readonly left: E
  5. * readonly right: A
  6. * }
  7. * ```
  8. *
  9. * Represents a result of separating a whole into two parts.
  10. *
  11. * @since 2.10.0
  12. */
  13. import { pipe } from './function';
  14. import { flap as flap_ } from './Functor';
  15. // -------------------------------------------------------------------------------------
  16. // constructors
  17. // -------------------------------------------------------------------------------------
  18. /**
  19. * @category constructors
  20. * @since 2.10.0
  21. */
  22. export var separated = function (left, right) { return ({ left: left, right: right }); };
  23. var _map = function (fa, f) { return pipe(fa, map(f)); };
  24. var _mapLeft = function (fa, f) { return pipe(fa, mapLeft(f)); };
  25. var _bimap = function (fa, g, f) { return pipe(fa, bimap(g, f)); };
  26. /**
  27. * `map` can be used to turn functions `(a: A) => B` into functions `(fa: F<A>) => F<B>` whose argument and return types
  28. * use the type constructor `F` to represent some computational context.
  29. *
  30. * @category mapping
  31. * @since 2.10.0
  32. */
  33. export var map = function (f) {
  34. return function (fa) {
  35. return separated(left(fa), f(right(fa)));
  36. };
  37. };
  38. /**
  39. * Map a function over the first type argument of a bifunctor.
  40. *
  41. * @category error handling
  42. * @since 2.10.0
  43. */
  44. export var mapLeft = function (f) {
  45. return function (fa) {
  46. return separated(f(left(fa)), right(fa));
  47. };
  48. };
  49. /**
  50. * Map a pair of functions over the two type arguments of the bifunctor.
  51. *
  52. * @category mapping
  53. * @since 2.10.0
  54. */
  55. export var bimap = function (f, g) {
  56. return function (fa) {
  57. return separated(f(left(fa)), g(right(fa)));
  58. };
  59. };
  60. /**
  61. * @category type lambdas
  62. * @since 2.10.0
  63. */
  64. export var URI = 'Separated';
  65. /**
  66. * @category instances
  67. * @since 2.10.0
  68. */
  69. export var Bifunctor = {
  70. URI: URI,
  71. mapLeft: _mapLeft,
  72. bimap: _bimap
  73. };
  74. /**
  75. * @category instances
  76. * @since 2.10.0
  77. */
  78. export var Functor = {
  79. URI: URI,
  80. map: _map
  81. };
  82. /**
  83. * @category mapping
  84. * @since 2.10.0
  85. */
  86. export var flap = /*#__PURE__*/ flap_(Functor);
  87. // -------------------------------------------------------------------------------------
  88. // utils
  89. // -------------------------------------------------------------------------------------
  90. /**
  91. * @since 2.10.0
  92. */
  93. export var left = function (s) { return s.left; };
  94. /**
  95. * @since 2.10.0
  96. */
  97. export var right = function (s) { return s.right; };