| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- import { BaseObservable, transaction, ConvenientObservable, getFunctionName } from './base.js';
- import { getLogger } from './logging.js';
- export function constObservable(value) {
- return new ConstObservable(value);
- }
- class ConstObservable extends ConvenientObservable {
- constructor(value) {
- super();
- this.value = value;
- }
- get debugName() {
- return this.toString();
- }
- get() {
- return this.value;
- }
- addObserver(observer) {
- // NO OP
- }
- removeObserver(observer) {
- // NO OP
- }
- toString() {
- return `Const: ${this.value}`;
- }
- }
- export function observableFromEvent(event, getValue) {
- return new FromEventObservable(event, getValue);
- }
- export class FromEventObservable extends BaseObservable {
- constructor(event, getValue) {
- super();
- this.event = event;
- this.getValue = getValue;
- this.hasValue = false;
- this.handleEvent = (args) => {
- var _a;
- const newValue = this.getValue(args);
- const didChange = !this.hasValue || this.value !== newValue;
- (_a = getLogger()) === null || _a === void 0 ? void 0 : _a.handleFromEventObservableTriggered(this, { oldValue: this.value, newValue, change: undefined, didChange });
- if (didChange) {
- this.value = newValue;
- if (this.hasValue) {
- transaction((tx) => {
- for (const o of this.observers) {
- tx.updateObserver(o, this);
- o.handleChange(this, undefined);
- }
- }, () => {
- const name = this.getDebugName();
- return 'Event fired' + (name ? `: ${name}` : '');
- });
- }
- this.hasValue = true;
- }
- };
- }
- getDebugName() {
- return getFunctionName(this.getValue);
- }
- get debugName() {
- const name = this.getDebugName();
- return 'From Event' + (name ? `: ${name}` : '');
- }
- onFirstObserverAdded() {
- this.subscription = this.event(this.handleEvent);
- }
- onLastObserverRemoved() {
- this.subscription.dispose();
- this.subscription = undefined;
- this.hasValue = false;
- this.value = undefined;
- }
- get() {
- if (this.subscription) {
- if (!this.hasValue) {
- this.handleEvent(undefined);
- }
- return this.value;
- }
- else {
- // no cache, as there are no subscribers to keep it updated
- return this.getValue(undefined);
- }
- }
- }
- (function (observableFromEvent) {
- observableFromEvent.Observer = FromEventObservable;
- })(observableFromEvent || (observableFromEvent = {}));
- export function observableSignalFromEvent(debugName, event) {
- return new FromEventObservableSignal(debugName, event);
- }
- class FromEventObservableSignal extends BaseObservable {
- constructor(debugName, event) {
- super();
- this.debugName = debugName;
- this.event = event;
- this.handleEvent = () => {
- transaction((tx) => {
- for (const o of this.observers) {
- tx.updateObserver(o, this);
- o.handleChange(this, undefined);
- }
- }, () => this.debugName);
- };
- }
- onFirstObserverAdded() {
- this.subscription = this.event(this.handleEvent);
- }
- onLastObserverRemoved() {
- this.subscription.dispose();
- this.subscription = undefined;
- }
- get() {
- // NO OP
- }
- }
- export function observableSignal(debugName) {
- return new ObservableSignal(debugName);
- }
- class ObservableSignal extends BaseObservable {
- constructor(debugName) {
- super();
- this.debugName = debugName;
- }
- trigger(tx, change) {
- if (!tx) {
- transaction(tx => {
- this.trigger(tx, change);
- }, () => `Trigger signal ${this.debugName}`);
- return;
- }
- for (const o of this.observers) {
- tx.updateObserver(o, this);
- o.handleChange(this, change);
- }
- }
- get() {
- // NO OP
- }
- }
|