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

90 рядки
2.8 KiB

  1. import { ap as ap_ } from './Apply';
  2. import { constant, flow, pipe } from './function';
  3. import { map as map_ } from './Functor';
  4. import * as O from './Option';
  5. export function some(F) {
  6. return flow(O.some, F.of);
  7. }
  8. export function zero(F) {
  9. return constant(F.of(O.none));
  10. }
  11. export function fromF(F) {
  12. return function (ma) { return F.map(ma, O.some); };
  13. }
  14. export function fromNullable(F) {
  15. return flow(O.fromNullable, F.of);
  16. }
  17. export function fromNullableK(F) {
  18. var fromNullableF = fromNullable(F);
  19. return function (f) { return flow(f, fromNullableF); };
  20. }
  21. export function chainNullableK(M) {
  22. var chainM = chain(M);
  23. var fromNullableKM = fromNullableK(M);
  24. return function (f) { return chainM(fromNullableKM(f)); };
  25. }
  26. export function fromOptionK(F) {
  27. return function (f) { return flow(f, F.of); };
  28. }
  29. export function chainOptionK(M) {
  30. var chainM = chain(M);
  31. var fromOptionKM = fromOptionK(M);
  32. return function (f) { return chainM(fromOptionKM(f)); };
  33. }
  34. export function fromPredicate(F) {
  35. return function (predicate) {
  36. return function (a) {
  37. return F.of(O.fromPredicate(predicate)(a));
  38. };
  39. };
  40. }
  41. export function fromEither(F) {
  42. return flow(O.fromEither, F.of);
  43. }
  44. export function match(F) {
  45. return function (onNone, onSome) { return function (ma) { return F.map(ma, O.match(onNone, onSome)); }; };
  46. }
  47. export function matchE(M) {
  48. return function (onNone, onSome) { return function (ma) { return M.chain(ma, O.match(onNone, onSome)); }; };
  49. }
  50. export function getOrElse(M) {
  51. return function (onNone) { return function (fa) { return M.chain(fa, O.match(onNone, M.of)); }; };
  52. }
  53. export function map(F) {
  54. return map_(F, O.Functor);
  55. }
  56. export function ap(F) {
  57. return ap_(F, O.Apply);
  58. }
  59. export function chain(M) {
  60. var zeroM = zero(M);
  61. return function (f) { return function (ma) {
  62. return M.chain(ma, O.match(function () { return zeroM(); }, f));
  63. }; };
  64. }
  65. export function alt(M) {
  66. var _some = some(M);
  67. return function (second) { return function (first) { return M.chain(first, O.match(second, _some)); }; };
  68. }
  69. /** @deprecated */
  70. export function getOptionM(M) {
  71. var apM = ap(M);
  72. var mapM = map(M);
  73. var chainM = chain(M);
  74. var altM = alt(M);
  75. var foldM = matchE(M);
  76. var getOrElseM = getOrElse(M);
  77. var zeroM = zero(M);
  78. return {
  79. map: function (fa, f) { return pipe(fa, mapM(f)); },
  80. ap: function (fab, fa) { return pipe(fab, apM(fa)); },
  81. of: some(M),
  82. chain: function (ma, f) { return pipe(ma, chainM(f)); },
  83. alt: function (fa, that) { return pipe(fa, altM(that)); },
  84. fold: function (fa, onNone, onSome) { return pipe(fa, foldM(onNone, onSome)); },
  85. getOrElse: function (fa, onNone) { return pipe(fa, getOrElseM(onNone)); },
  86. fromM: fromF(M),
  87. none: function () { return zeroM(); }
  88. };
  89. }