1
1
import { 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'
3
15
import { Selector } from './Selector'
4
16
import { ProxySelector } from './ProxySelector'
5
17
import { assert } from '../../utils/assert'
@@ -14,7 +26,7 @@ function initialTraceResult<T>(list: ReadonlyArray<T>): TraceResult<T> {
14
26
return {
15
27
type : OpsType . Success ,
16
28
ops : list . map ( ( _value , index ) => ( { type : OpType . New , index } ) ) ,
17
- result : list
29
+ result : list ,
18
30
}
19
31
}
20
32
@@ -28,20 +40,19 @@ export class QueryToken<T> {
28
40
selector$ : Observable < SelectorMeta < T > >
29
41
30
42
private consumed = false
43
+ private lastEmit : ReadonlyArray < T > | undefined
44
+ private trace : ReadonlyArray < T > | undefined
31
45
32
- constructor (
33
- selector$ : Observable < SelectorMeta < T > > ,
34
- private lastEmit ?: ReadonlyArray < T >
35
- ) {
46
+ constructor ( selector$ : Observable < SelectorMeta < T > > , trace ?: ReadonlyArray < T > ) {
36
47
this . selector$ = selector$ . pipe (
37
48
publishReplay ( 1 ) ,
38
49
refCount ( ) ,
39
50
)
40
- this . lastEmit = lastEmit
51
+ this . trace = trace
41
52
}
42
53
43
- setLastEmit ( data : T [ ] ) {
44
- this . lastEmit = data
54
+ setTrace ( data : T [ ] ) {
55
+ this . trace = data
45
56
}
46
57
47
58
map < K > ( fn : OperatorFunction < T [ ] , K [ ] > ) {
@@ -68,11 +79,14 @@ export class QueryToken<T> {
68
79
69
80
traces ( pk ?: string ) : Observable < TraceResult < T > > {
70
81
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 ) {
73
87
return initialTraceResult ( result )
74
88
}
75
- const ops = diff ( this . lastEmit , result , pk )
89
+ const ops = diff ( prev , result , pk )
76
90
return { result, ...ops }
77
91
} ) ,
78
92
filter ( ( { type } ) => type !== OpsType . ShouldSkip ) ,
0 commit comments