1 import { uniq } from 'lodash-es'
2 import { asyncScheduler, Observable } from 'rxjs'
3 import { bufferTime, distinctUntilChanged, filter, map, observeOn, share, switchMap } from 'rxjs/operators'
4 import { NgZone } from '@angular/core'
5 import { enterZone, leaveZone } from './zone'
7 function buildBulkObservable <T extends number | string, R> (options: {
9 notifierObservable: Observable<T>
11 bulkGet: (params: T[]) => Observable<R>
13 const { ngZone, notifierObservable, time, bulkGet } = options
15 return notifierObservable.pipe(
16 distinctUntilChanged(),
17 // We leave Angular zone so Protractor does not get stuck
18 bufferTime(time, leaveZone(ngZone, asyncScheduler)),
19 filter(params => params.length !== 0),
20 map(params => uniq(params)),
21 observeOn(enterZone(ngZone, asyncScheduler)),
22 switchMap(params => bulkGet(params)),