groupBy.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */
  2. import * as tslib_1 from "tslib";
  3. import { Subscriber } from '../Subscriber';
  4. import { Subscription } from '../Subscription';
  5. import { Observable } from '../Observable';
  6. import { Subject } from '../Subject';
  7. export function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
  8. return function (source) {
  9. return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
  10. };
  11. }
  12. var GroupByOperator = /*@__PURE__*/ (function () {
  13. function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
  14. this.keySelector = keySelector;
  15. this.elementSelector = elementSelector;
  16. this.durationSelector = durationSelector;
  17. this.subjectSelector = subjectSelector;
  18. }
  19. GroupByOperator.prototype.call = function (subscriber, source) {
  20. return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
  21. };
  22. return GroupByOperator;
  23. }());
  24. var GroupBySubscriber = /*@__PURE__*/ (function (_super) {
  25. tslib_1.__extends(GroupBySubscriber, _super);
  26. function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
  27. var _this = _super.call(this, destination) || this;
  28. _this.keySelector = keySelector;
  29. _this.elementSelector = elementSelector;
  30. _this.durationSelector = durationSelector;
  31. _this.subjectSelector = subjectSelector;
  32. _this.groups = null;
  33. _this.attemptedToUnsubscribe = false;
  34. _this.count = 0;
  35. return _this;
  36. }
  37. GroupBySubscriber.prototype._next = function (value) {
  38. var key;
  39. try {
  40. key = this.keySelector(value);
  41. }
  42. catch (err) {
  43. this.error(err);
  44. return;
  45. }
  46. this._group(value, key);
  47. };
  48. GroupBySubscriber.prototype._group = function (value, key) {
  49. var groups = this.groups;
  50. if (!groups) {
  51. groups = this.groups = new Map();
  52. }
  53. var group = groups.get(key);
  54. var element;
  55. if (this.elementSelector) {
  56. try {
  57. element = this.elementSelector(value);
  58. }
  59. catch (err) {
  60. this.error(err);
  61. }
  62. }
  63. else {
  64. element = value;
  65. }
  66. if (!group) {
  67. group = (this.subjectSelector ? this.subjectSelector() : new Subject());
  68. groups.set(key, group);
  69. var groupedObservable = new GroupedObservable(key, group, this);
  70. this.destination.next(groupedObservable);
  71. if (this.durationSelector) {
  72. var duration = void 0;
  73. try {
  74. duration = this.durationSelector(new GroupedObservable(key, group));
  75. }
  76. catch (err) {
  77. this.error(err);
  78. return;
  79. }
  80. this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
  81. }
  82. }
  83. if (!group.closed) {
  84. group.next(element);
  85. }
  86. };
  87. GroupBySubscriber.prototype._error = function (err) {
  88. var groups = this.groups;
  89. if (groups) {
  90. groups.forEach(function (group, key) {
  91. group.error(err);
  92. });
  93. groups.clear();
  94. }
  95. this.destination.error(err);
  96. };
  97. GroupBySubscriber.prototype._complete = function () {
  98. var groups = this.groups;
  99. if (groups) {
  100. groups.forEach(function (group, key) {
  101. group.complete();
  102. });
  103. groups.clear();
  104. }
  105. this.destination.complete();
  106. };
  107. GroupBySubscriber.prototype.removeGroup = function (key) {
  108. this.groups.delete(key);
  109. };
  110. GroupBySubscriber.prototype.unsubscribe = function () {
  111. if (!this.closed) {
  112. this.attemptedToUnsubscribe = true;
  113. if (this.count === 0) {
  114. _super.prototype.unsubscribe.call(this);
  115. }
  116. }
  117. };
  118. return GroupBySubscriber;
  119. }(Subscriber));
  120. var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) {
  121. tslib_1.__extends(GroupDurationSubscriber, _super);
  122. function GroupDurationSubscriber(key, group, parent) {
  123. var _this = _super.call(this, group) || this;
  124. _this.key = key;
  125. _this.group = group;
  126. _this.parent = parent;
  127. return _this;
  128. }
  129. GroupDurationSubscriber.prototype._next = function (value) {
  130. this.complete();
  131. };
  132. GroupDurationSubscriber.prototype._unsubscribe = function () {
  133. var _a = this, parent = _a.parent, key = _a.key;
  134. this.key = this.parent = null;
  135. if (parent) {
  136. parent.removeGroup(key);
  137. }
  138. };
  139. return GroupDurationSubscriber;
  140. }(Subscriber));
  141. var GroupedObservable = /*@__PURE__*/ (function (_super) {
  142. tslib_1.__extends(GroupedObservable, _super);
  143. function GroupedObservable(key, groupSubject, refCountSubscription) {
  144. var _this = _super.call(this) || this;
  145. _this.key = key;
  146. _this.groupSubject = groupSubject;
  147. _this.refCountSubscription = refCountSubscription;
  148. return _this;
  149. }
  150. GroupedObservable.prototype._subscribe = function (subscriber) {
  151. var subscription = new Subscription();
  152. var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
  153. if (refCountSubscription && !refCountSubscription.closed) {
  154. subscription.add(new InnerRefCountSubscription(refCountSubscription));
  155. }
  156. subscription.add(groupSubject.subscribe(subscriber));
  157. return subscription;
  158. };
  159. return GroupedObservable;
  160. }(Observable));
  161. export { GroupedObservable };
  162. var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) {
  163. tslib_1.__extends(InnerRefCountSubscription, _super);
  164. function InnerRefCountSubscription(parent) {
  165. var _this = _super.call(this) || this;
  166. _this.parent = parent;
  167. parent.count++;
  168. return _this;
  169. }
  170. InnerRefCountSubscription.prototype.unsubscribe = function () {
  171. var parent = this.parent;
  172. if (!parent.closed && !this.closed) {
  173. _super.prototype.unsubscribe.call(this);
  174. parent.count -= 1;
  175. if (parent.count === 0 && parent.attemptedToUnsubscribe) {
  176. parent.unsubscribe();
  177. }
  178. }
  179. };
  180. return InnerRefCountSubscription;
  181. }(Subscription));
  182. //# sourceMappingURL=groupBy.js.map