From c7f7d24273381f2f8e165771002b956b2bc574ef Mon Sep 17 00:00:00 2001 From: Bruno Windels <274386+bwindels@users.noreply.github.com> Date: Tue, 26 Apr 2022 14:26:33 +0200 Subject: [PATCH] utility: observable value that emits when event is fired --- src/observable/value/EventObservableValue.ts | 45 ++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/observable/value/EventObservableValue.ts diff --git a/src/observable/value/EventObservableValue.ts b/src/observable/value/EventObservableValue.ts new file mode 100644 index 00000000..0f5fd524 --- /dev/null +++ b/src/observable/value/EventObservableValue.ts @@ -0,0 +1,45 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {BaseObservableValue} from "./BaseObservableValue"; +import {EventEmitter} from "../../utils/EventEmitter"; + +export class EventObservableValue> extends BaseObservableValue { + private eventSubscription: () => void; + + constructor( + private readonly value: V, + private readonly eventName: keyof T + ) { + super(); + } + + onSubscribeFirst(): void { + this.eventSubscription = this.value.disposableOn(this.eventName, () => { + this.emit(this.value); + }); + super.onSubscribeFirst(); + } + + onUnsubscribeLast(): void { + this.eventSubscription!(); + super.onUnsubscribeLast(); + } + + get(): V { + return this.value; + } +}