utils.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. var __read = (this && this.__read) || function (o, n) {
  2. var m = typeof Symbol === "function" && o[Symbol.iterator];
  3. if (!m) return o;
  4. var i = m.call(o), r, ar = [], e;
  5. try {
  6. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  7. }
  8. catch (error) { e = { error: error }; }
  9. finally {
  10. try {
  11. if (r && !r.done && (m = i["return"])) m.call(i);
  12. }
  13. finally { if (e) throw e.error; }
  14. }
  15. return ar;
  16. };
  17. var __values = (this && this.__values) || function(o) {
  18. var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  19. if (m) return m.call(o);
  20. if (o && typeof o.length === "number") return {
  21. next: function () {
  22. if (o && i >= o.length) o = void 0;
  23. return { value: o && o[i++], done: !o };
  24. }
  25. };
  26. throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
  27. };
  28. import { InterpreterStatus } from 'xstate';
  29. export function partition(items, predicate) {
  30. var e_1, _a;
  31. var _b = __read([[], []], 2), truthy = _b[0], falsy = _b[1];
  32. try {
  33. for (var items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
  34. var item = items_1_1.value;
  35. if (predicate(item)) {
  36. truthy.push(item);
  37. }
  38. else {
  39. falsy.push(item);
  40. }
  41. }
  42. }
  43. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  44. finally {
  45. try {
  46. if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
  47. }
  48. finally { if (e_1) throw e_1.error; }
  49. }
  50. return [truthy, falsy];
  51. }
  52. export function getServiceSnapshot(service) {
  53. return service.status !== 0
  54. ? service.getSnapshot()
  55. : service.machine.initialState;
  56. }
  57. // From https://github.com/reduxjs/react-redux/blob/master/src/utils/shallowEqual.ts
  58. function is(x, y) {
  59. if (x === y) {
  60. return x !== 0 || y !== 0 || 1 / x === 1 / y;
  61. }
  62. else {
  63. return x !== x && y !== y;
  64. }
  65. }
  66. export function shallowEqual(objA, objB) {
  67. if (is(objA, objB))
  68. return true;
  69. if (typeof objA !== 'object' ||
  70. objA === null ||
  71. typeof objB !== 'object' ||
  72. objB === null) {
  73. return false;
  74. }
  75. var keysA = Object.keys(objA);
  76. var keysB = Object.keys(objB);
  77. if (keysA.length !== keysB.length)
  78. return false;
  79. for (var i = 0; i < keysA.length; i++) {
  80. if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) ||
  81. !is(objA[keysA[i]], objB[keysA[i]])) {
  82. return false;
  83. }
  84. }
  85. return true;
  86. }
  87. export function isService(actor) {
  88. return 'state' in actor && 'machine' in actor;
  89. }
  90. export function isInterpreterStateEqual(service, prevState, nextState) {
  91. if (service.status === InterpreterStatus.NotStarted) {
  92. return true;
  93. }
  94. // Only change the current state if:
  95. // - the incoming state is the "live" initial state (since it might have new actors)
  96. // - OR the incoming state actually changed.
  97. //
  98. // The "live" initial state will have .changed === undefined.
  99. var initialStateChanged = nextState.changed === undefined &&
  100. (Object.keys(nextState.children).length > 0 ||
  101. typeof prevState.changed === 'boolean');
  102. return !(nextState.changed || initialStateChanged);
  103. }