react-obsidian
Version:
Dependency injection framework for React and React Native applications
45 lines (37 loc) • 1.19 kB
text/typescript
import { Observable as IObservable, OnNext, Unsubscribe } from './types';
export class Observable<T> implements IObservable<T> {
private subscribers: Set<OnNext<T>> = new Set();
private currentValue: T | undefined;
constructor(initialValue?: T) {
this.currentValue = initialValue;
}
public get value(): T {
return this.currentValue as T;
}
public set value(value: T) {
this.currentValue = value;
this.subscribers.forEach((subscriber) => subscriber(value));
}
async first(): Promise<T> {
if (this.currentValue) return this.currentValue;
return new Promise((resolve) => {
const unsubscribe = this.subscribe((value) => {
unsubscribe();
resolve(value);
});
});
}
public subscribe(onNext: OnNext<T>): Unsubscribe {
if (this.subscribers.has(onNext)) {
throw new Error('Subscriber already subscribed');
}
this.subscribers.add(onNext);
return () => this.subscribers.delete(onNext);
}
public unsubscribe(onNext:OnNext<T>) {
if (!this.subscribers.has(onNext)) {
throw new Error(`Can't unsubscribe, subscriber doesn't exist`);
}
this.subscribers.delete(onNext);
}
}