@@ -4,10 +4,18 @@ import { Selector } from './Selector'
4
4
import { ProxySelector } from './ProxySelector'
5
5
import { assert } from '../../utils/assert'
6
6
import { TokenConsumed } from '../../exception/token'
7
- import { diff , Ops , OpsType } from '../../utils/diff'
7
+ import { diff , Ops , OpsType , OpType } from '../../utils/diff'
8
8
9
9
export type TraceResult < T > = Ops & {
10
- result : T [ ]
10
+ result : ReadonlyArray < T >
11
+ }
12
+
13
+ function initialTraceResult < T > ( list : ReadonlyArray < T > ) : TraceResult < T > {
14
+ return {
15
+ type : OpsType . Success ,
16
+ ops : list . map ( ( _value , index ) => ( { type : OpType . New , index } ) ) ,
17
+ result : list
18
+ }
11
19
}
12
20
13
21
export type SelectorMeta < T > = Selector < T > | ProxySelector < T >
@@ -20,14 +28,16 @@ export class QueryToken<T> {
20
28
selector$ : Observable < SelectorMeta < T > >
21
29
22
30
private consumed = false
23
- private lastEmit : T [ ] = [ ]
24
31
25
- constructor ( selector$ : Observable < SelectorMeta < T > > , lastEmit ?: T [ ] ) {
32
+ constructor (
33
+ selector$ : Observable < SelectorMeta < T > > ,
34
+ private lastEmit ?: ReadonlyArray < T >
35
+ ) {
26
36
this . selector$ = selector$ . pipe (
27
37
publishReplay ( 1 ) ,
28
38
refCount ( ) ,
29
39
)
30
- this . lastEmit = lastEmit || [ ]
40
+ this . lastEmit = lastEmit
31
41
}
32
42
33
43
setLastEmit ( data : T [ ] ) {
@@ -59,6 +69,9 @@ export class QueryToken<T> {
59
69
traces ( pk ?: string ) : Observable < TraceResult < T > > {
60
70
return this . changes ( ) . pipe (
61
71
map ( ( result : T [ ] ) => {
72
+ if ( ! this . lastEmit ) {
73
+ return initialTraceResult ( result )
74
+ }
62
75
const ops = diff ( this . lastEmit , result , pk )
63
76
return { result, ...ops }
64
77
} ) ,
0 commit comments