11import { Observable , OperatorFunction , from } from 'rxjs'
2- import { combineAll , filter , map , publishReplay , refCount , skipWhile , switchMap , take , tap } from 'rxjs/operators'
2+ import {
3+ combineAll ,
4+ filter ,
5+ map ,
6+ pairwise ,
7+ publishReplay ,
8+ refCount ,
9+ skipWhile ,
10+ switchMap ,
11+ startWith ,
12+ take ,
13+ tap ,
14+ } from 'rxjs/operators'
315import { Selector } from './Selector'
416import { ProxySelector } from './ProxySelector'
517import { assert } from '../../utils/assert'
@@ -14,7 +26,7 @@ function initialTraceResult<T>(list: ReadonlyArray<T>): TraceResult<T> {
1426 return {
1527 type : OpsType . Success ,
1628 ops : list . map ( ( _value , index ) => ( { type : OpType . New , index } ) ) ,
17- result : list
29+ result : list ,
1830 }
1931}
2032
@@ -28,20 +40,19 @@ export class QueryToken<T> {
2840 selector$ : Observable < SelectorMeta < T > >
2941
3042 private consumed = false
43+ private lastEmit : ReadonlyArray < T > | undefined
44+ private trace : ReadonlyArray < T > | undefined
3145
32- constructor (
33- selector$ : Observable < SelectorMeta < T > > ,
34- private lastEmit ?: ReadonlyArray < T >
35- ) {
46+ constructor ( selector$ : Observable < SelectorMeta < T > > , trace ?: ReadonlyArray < T > ) {
3647 this . selector$ = selector$ . pipe (
3748 publishReplay ( 1 ) ,
3849 refCount ( ) ,
3950 )
40- this . lastEmit = lastEmit
51+ this . trace = trace
4152 }
4253
43- setLastEmit ( data : T [ ] ) {
44- this . lastEmit = data
54+ setTrace ( data : T [ ] ) {
55+ this . trace = data
4556 }
4657
4758 map < K > ( fn : OperatorFunction < T [ ] , K [ ] > ) {
@@ -68,11 +79,14 @@ export class QueryToken<T> {
6879
6980 traces ( pk ?: string ) : Observable < TraceResult < T > > {
7081 return this . changes ( ) . pipe (
71- map ( ( result : T [ ] ) => {
72- if ( ! this . lastEmit ) {
82+ startWith < undefined | ReadonlyArray < T > > ( this . trace ) ,
83+ pairwise ( ) ,
84+ map ( ( [ prev , curr ] ) => {
85+ const result = curr !
86+ if ( ! prev ) {
7387 return initialTraceResult ( result )
7488 }
75- const ops = diff ( this . lastEmit , result , pk )
89+ const ops = diff ( prev , result , pk )
7690 return { result, ...ops }
7791 } ) ,
7892 filter ( ( { type } ) => type !== OpsType . ShouldSkip ) ,
0 commit comments