6
6
EntityStateAdapter ,
7
7
Update ,
8
8
} from './models' ;
9
- import { createStateOperator } from './state_adapter' ;
9
+ import { createStateOperator , DidMutate } from './state_adapter' ;
10
10
import { createUnsortedStateAdapter } from './unsorted_state_adapter' ;
11
11
12
12
export function createSortedStateAdapter < T > (
@@ -20,68 +20,94 @@ export function createSortedStateAdapter<T>(selectId: any, sort: any): any {
20
20
selectId
21
21
) ;
22
22
23
- function addOneMutably ( entity : T , state : R ) : boolean ;
24
- function addOneMutably ( entity : any , state : any ) : boolean {
23
+ function addOneMutably ( entity : T , state : R ) : DidMutate ;
24
+ function addOneMutably ( entity : any , state : any ) : DidMutate {
25
25
return addManyMutably ( [ entity ] , state ) ;
26
26
}
27
27
28
- function addManyMutably ( newModels : T [ ] , state : R ) : boolean ;
29
- function addManyMutably ( newModels : any [ ] , state : any ) : boolean {
28
+ function addManyMutably ( newModels : T [ ] , state : R ) : DidMutate ;
29
+ function addManyMutably ( newModels : any [ ] , state : any ) : DidMutate {
30
30
const models = newModels . filter (
31
31
model => ! ( selectId ( model ) in state . entities )
32
32
) ;
33
33
34
- return merge ( models , state ) ;
34
+ if ( models . length === 0 ) {
35
+ return DidMutate . None ;
36
+ } else {
37
+ merge ( models , state ) ;
38
+ return DidMutate . Both ;
39
+ }
35
40
}
36
41
37
- function addAllMutably ( models : T [ ] , state : R ) : boolean ;
38
- function addAllMutably ( models : any [ ] , state : any ) : boolean {
42
+ function addAllMutably ( models : T [ ] , state : R ) : DidMutate ;
43
+ function addAllMutably ( models : any [ ] , state : any ) : DidMutate {
39
44
state . entities = { } ;
40
45
state . ids = [ ] ;
41
46
42
47
addManyMutably ( models , state ) ;
43
48
44
- return true ;
49
+ return DidMutate . Both ;
45
50
}
46
51
47
- function updateOneMutably ( update : Update < T > , state : R ) : boolean ;
48
- function updateOneMutably ( update : any , state : any ) : boolean {
52
+ function updateOneMutably ( update : Update < T > , state : R ) : DidMutate ;
53
+ function updateOneMutably ( update : any , state : any ) : DidMutate {
49
54
return updateManyMutably ( [ update ] , state ) ;
50
55
}
51
56
52
- function takeUpdatedModel ( models : T [ ] , update : Update < T > , state : R ) : void ;
53
- function takeUpdatedModel ( models : any [ ] , update : any , state : any ) : void {
57
+ function takeUpdatedModel ( models : T [ ] , update : Update < T > , state : R ) : boolean ;
58
+ function takeUpdatedModel ( models : any [ ] , update : any , state : any ) : boolean {
54
59
if ( ! ( update . id in state . entities ) ) {
55
- return ;
60
+ return false ;
56
61
}
57
62
58
63
const original = state . entities [ update . id ] ;
59
64
const updated = Object . assign ( { } , original , update . changes ) ;
65
+ const newKey = selectId ( updated ) ;
60
66
61
67
delete state . entities [ update . id ] ;
62
68
63
69
models . push ( updated ) ;
70
+
71
+ return newKey !== update . id ;
64
72
}
65
73
66
- function updateManyMutably ( updates : Update < T > [ ] , state : R ) : boolean ;
67
- function updateManyMutably ( updates : any [ ] , state : any ) : boolean {
74
+ function updateManyMutably ( updates : Update < T > [ ] , state : R ) : DidMutate ;
75
+ function updateManyMutably ( updates : any [ ] , state : any ) : DidMutate {
68
76
const models : T [ ] = [ ] ;
69
77
70
- updates . forEach ( update => takeUpdatedModel ( models , update , state ) ) ;
71
-
72
- if ( models . length ) {
73
- state . ids = state . ids . filter ( ( id : any ) => id in state . entities ) ;
74
- }
78
+ const didMutateIds =
79
+ updates . filter ( update => takeUpdatedModel ( models , update , state ) ) . length >
80
+ 0 ;
75
81
76
- return merge ( models , state ) ;
77
- }
78
-
79
- function merge ( models : T [ ] , state : R ) : boolean ;
80
- function merge ( models : any [ ] , state : any ) : boolean {
81
82
if ( models . length === 0 ) {
82
- return false ;
83
+ return DidMutate . None ;
84
+ } else {
85
+ const originalIds = state . ids ;
86
+ const updatedIndexes : any [ ] = [ ] ;
87
+ state . ids = state . ids . filter ( ( id : any , index : number ) => {
88
+ if ( id in state . entities ) {
89
+ return true ;
90
+ } else {
91
+ updatedIndexes . push ( index ) ;
92
+ return false ;
93
+ }
94
+ } ) ;
95
+
96
+ merge ( models , state ) ;
97
+
98
+ if (
99
+ ! didMutateIds &&
100
+ updatedIndexes . every ( ( i : number ) => state . ids [ i ] === originalIds [ i ] )
101
+ ) {
102
+ return DidMutate . EntitiesOnly ;
103
+ } else {
104
+ return DidMutate . Both ;
105
+ }
83
106
}
107
+ }
84
108
109
+ function merge ( models : T [ ] , state : R ) : void ;
110
+ function merge ( models : any [ ] , state : any ) : void {
85
111
models . sort ( sort ) ;
86
112
87
113
const ids : any [ ] = [ ] ;
@@ -113,8 +139,6 @@ export function createSortedStateAdapter<T>(selectId: any, sort: any): any {
113
139
models . forEach ( ( model , i ) => {
114
140
state . entities [ selectId ( model ) ] = model ;
115
141
} ) ;
116
-
117
- return true ;
118
142
}
119
143
120
144
return {
0 commit comments