Skip to content

Instantly share code, notes, and snippets.

@yjaaidi
Created June 10, 2017 10:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yjaaidi/ddb11579b09b4486a35d9c608d9a2bca to your computer and use it in GitHub Desktop.
Save yjaaidi/ddb11579b09b4486a35d9c608d9a2bca to your computer and use it in GitHub Desktop.
Reactive Store
import { ReplaySubject } from 'rxjs/ReplaySubject';
import { Observable } from 'rxjs/Observable';
export abstract class ReplayStore<T> {
private _isInitialized = false;
private _state: T;
private _state$: ReplaySubject<T>;
constructor() {
this._state$ = new ReplaySubject<T>(1);
this._state$
.subscribe((state) => this._state = state);
}
get state(): T {
return this._state;
}
get replaySubject(): Observable<T> {
if (!this._isInitialized) {
return this._lazyInit()
.do((state) => this._setState(state));
}
return this._state$.asObservable();
}
protected abstract _lazyInit(): Observable<T>;
protected _setIsInitialized() {
this._isInitialized = true;
}
protected _setState(state: T) {
this._state$.next(state);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment