@@ -4,10 +4,18 @@ import { Selector } from './Selector'
44import { ProxySelector } from './ProxySelector'
55import { assert } from '../../utils/assert'
66import { TokenConsumed } from '../../exception/token'
7- import { diff , Ops , OpsType } from '../../utils/diff'
7+ import { diff , Ops , OpsType , OpType } from '../../utils/diff'
88
99export 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+ }
1119}
1220
1321export type SelectorMeta < T > = Selector < T > | ProxySelector < T >
@@ -20,14 +28,16 @@ export class QueryToken<T> {
2028 selector$ : Observable < SelectorMeta < T > >
2129
2230 private consumed = false
23- private lastEmit : T [ ] = [ ]
2431
25- constructor ( selector$ : Observable < SelectorMeta < T > > , lastEmit ?: T [ ] ) {
32+ constructor (
33+ selector$ : Observable < SelectorMeta < T > > ,
34+ private lastEmit ?: ReadonlyArray < T >
35+ ) {
2636 this . selector$ = selector$ . pipe (
2737 publishReplay ( 1 ) ,
2838 refCount ( ) ,
2939 )
30- this . lastEmit = lastEmit || [ ]
40+ this . lastEmit = lastEmit
3141 }
3242
3343 setLastEmit ( data : T [ ] ) {
@@ -59,6 +69,9 @@ export class QueryToken<T> {
5969 traces ( pk ?: string ) : Observable < TraceResult < T > > {
6070 return this . changes ( ) . pipe (
6171 map ( ( result : T [ ] ) => {
72+ if ( ! this . lastEmit ) {
73+ return initialTraceResult ( result )
74+ }
6275 const ops = diff ( this . lastEmit , result , pk )
6376 return { result, ...ops }
6477 } ) ,
0 commit comments