import { combineLatest, merge, Observable, of, Subject } from 'rxjs';
import { map, scan, shareReplay, startWith } from 'rxjs/operators';
interface ITestPayload {
id: number,
name?: string,
}
interface ICacheEvent {
eventType: 'INIT' | 'ADD' | 'EDIT' | 'DELETE',
payload: ITestPayload,
}
const source: Observable<Array<ITestPayload>> = of([{id: 1, name: 'World'}, {id: 2, name: 'test'}, {id: 3, name: 'azerty'}]);
const eventSubject$ = new Subject<ICacheEvent>();
const event$ = eventSubject$.asObservable();
const cache$: Observable<Array<ITestPayload>> = merge(
source,
event$,
).pipe(
scan((acc: ITestPayload[], value: ICacheEvent) => {
console.log('scan');
if (value.eventType === 'ADD'){
const index = acc.map(x => x.id).indexOf(value.payload.id);
if(index === -1) {
acc.push(value.payload);
}
}
else if (value.eventType === 'DELETE'){
const index = acc.map(x => x.id).indexOf(value.payload.id);
if(index >= 0) {
acc.splice(index, 1);
}
}
else if (value.eventType === 'EDIT'){
const index = acc.map(x => x.id).indexOf(value.payload.id);
if(index >= 0) {
acc[index] = value.payload;
}
}
return acc;
}))
cache$.subscribe(x => console.log('sub 0 :', x.map(item => item.name)));
eventSubject$.next({eventType: "ADD", payload: {id: 4, name: 'test 4'}})
eventSubject$.next({eventType: "EDIT", payload: {id: 2, name: 'value edited'}});
eventSubject$.next({eventType: "DELETE", payload: {id: 1}});