UNPKG

4.97 kBJavaScriptView Raw
1var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5 return c > 3 && r && Object.defineProperty(target, key, r), r;
6};
7import { computed, observable, action, runInAction, observe, makeObservable } from "mobx";
8function observableSymbol() {
9 return (typeof Symbol === "function" && Symbol.observable) || "@@observable";
10}
11/**
12 * Converts an expression to an observable stream (a.k.a. TC 39 Observable / RxJS observable).
13 * The provided expression is tracked by mobx as long as there are subscribers, automatically
14 * emitting when new values become available. The expressions respect (trans)actions.
15 *
16 * @example
17 *
18 * const user = observable({
19 * firstName: "C.S",
20 * lastName: "Lewis"
21 * })
22 *
23 * Rx.Observable
24 * .from(mobxUtils.toStream(() => user.firstname + user.lastName))
25 * .scan(nameChanges => nameChanges + 1, 0)
26 * .subscribe(nameChanges => console.log("Changed name ", nameChanges, "times"))
27 *
28 * @export
29 * @template T
30 * @param {() => T} expression
31 * @param {boolean} fireImmediately (by default false)
32 * @returns {IObservableStream<T>}
33 */
34export function toStream(expression, fireImmediately) {
35 var _a;
36 if (fireImmediately === void 0) { fireImmediately = false; }
37 var computedValue = computed(expression);
38 return _a = {
39 subscribe: function (observer) {
40 if ("function" === typeof observer) {
41 return {
42 unsubscribe: observe(computedValue, function (_a) {
43 var newValue = _a.newValue;
44 return observer(newValue);
45 }, fireImmediately),
46 };
47 }
48 if (observer && "object" === typeof observer && observer.next) {
49 return {
50 unsubscribe: observe(computedValue, function (_a) {
51 var newValue = _a.newValue;
52 return observer.next(newValue);
53 }, fireImmediately),
54 };
55 }
56 return {
57 unsubscribe: function () { },
58 };
59 }
60 },
61 _a[observableSymbol()] = function () {
62 return this;
63 },
64 _a;
65}
66var StreamListener = /** @class */ (function () {
67 function StreamListener(observable, initialValue) {
68 var _this = this;
69 Object.defineProperty(this, "current", {
70 enumerable: true,
71 configurable: true,
72 writable: true,
73 value: void 0
74 });
75 Object.defineProperty(this, "subscription", {
76 enumerable: true,
77 configurable: true,
78 writable: true,
79 value: void 0
80 });
81 makeObservable(this);
82 runInAction(function () {
83 _this.current = initialValue;
84 _this.subscription = observable.subscribe(_this);
85 });
86 }
87 Object.defineProperty(StreamListener.prototype, "dispose", {
88 enumerable: false,
89 configurable: true,
90 writable: true,
91 value: function () {
92 if (this.subscription) {
93 this.subscription.unsubscribe();
94 }
95 }
96 });
97 Object.defineProperty(StreamListener.prototype, "next", {
98 enumerable: false,
99 configurable: true,
100 writable: true,
101 value: function (value) {
102 this.current = value;
103 }
104 });
105 Object.defineProperty(StreamListener.prototype, "complete", {
106 enumerable: false,
107 configurable: true,
108 writable: true,
109 value: function () {
110 this.dispose();
111 }
112 });
113 Object.defineProperty(StreamListener.prototype, "error", {
114 enumerable: false,
115 configurable: true,
116 writable: true,
117 value: function (value) {
118 this.current = value;
119 this.dispose();
120 }
121 });
122 __decorate([
123 observable.ref
124 ], StreamListener.prototype, "current", void 0);
125 __decorate([
126 action.bound
127 ], StreamListener.prototype, "next", null);
128 __decorate([
129 action.bound
130 ], StreamListener.prototype, "complete", null);
131 __decorate([
132 action.bound
133 ], StreamListener.prototype, "error", null);
134 return StreamListener;
135}());
136export function fromStream(observable, initialValue) {
137 if (initialValue === void 0) { initialValue = undefined; }
138 return new StreamListener(observable, initialValue);
139}