@@ -49,12 +49,10 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
49
49
* For client-side synchronizer: it resets or updates the cache.
50
50
*/
51
51
resetSegments ( segmentsData : MySegmentsData | IMySegmentsResponse ) : boolean {
52
- this . setChangeNumber ( segmentsData . cn ) ;
53
-
54
52
const { added, removed } = segmentsData as MySegmentsData ;
53
+ let isDiff = false ;
55
54
56
55
if ( added && removed ) {
57
- let isDiff = false ;
58
56
59
57
added . forEach ( segment => {
60
58
isDiff = this . addSegment ( segment ) || isDiff ;
@@ -63,32 +61,40 @@ export abstract class AbstractMySegmentsCacheSync implements ISegmentsCacheSync
63
61
removed . forEach ( segment => {
64
62
isDiff = this . removeSegment ( segment ) || isDiff ;
65
63
} ) ;
64
+ } else {
66
65
67
- return isDiff ;
68
- }
66
+ const names = ( ( segmentsData as IMySegmentsResponse ) . k || [ ] ) . map ( s => s . n ) . sort ( ) ;
67
+ const storedSegmentKeys = this . getRegisteredSegments ( ) . sort ( ) ;
69
68
70
- const names = ( ( segmentsData as IMySegmentsResponse ) . k || [ ] ) . map ( s => s . n ) . sort ( ) ;
71
- const storedSegmentKeys = this . getRegisteredSegments ( ) . sort ( ) ;
69
+ // Extreme fast => everything is empty
70
+ if ( ! names . length && ! storedSegmentKeys . length ) {
71
+ isDiff = false ;
72
+ } else {
72
73
73
- // Extreme fast => everything is empty
74
- if ( ! names . length && ! storedSegmentKeys . length ) return false ;
74
+ let index = 0 ;
75
75
76
- let index = 0 ;
76
+ while ( index < names . length && index < storedSegmentKeys . length && names [ index ] === storedSegmentKeys [ index ] ) index ++ ;
77
77
78
- while ( index < names . length && index < storedSegmentKeys . length && names [ index ] === storedSegmentKeys [ index ] ) index ++ ;
78
+ // Quick path => no changes
79
+ if ( index === names . length && index === storedSegmentKeys . length ) {
80
+ isDiff = false ;
81
+ } else {
79
82
80
- // Quick path => no changes
81
- if ( index === names . length && index === storedSegmentKeys . length ) return false ;
83
+ // Slowest path => add and/or remove segments
84
+ for ( let removeIndex = index ; removeIndex < storedSegmentKeys . length ; removeIndex ++ ) {
85
+ this . removeSegment ( storedSegmentKeys [ removeIndex ] ) ;
86
+ }
82
87
83
- // Slowest path => add and/or remove segments
84
- for ( let removeIndex = index ; removeIndex < storedSegmentKeys . length ; removeIndex ++ ) {
85
- this . removeSegment ( storedSegmentKeys [ removeIndex ] ) ;
86
- }
88
+ for ( let addIndex = index ; addIndex < names . length ; addIndex ++ ) {
89
+ this . addSegment ( names [ addIndex ] ) ;
90
+ }
87
91
88
- for ( let addIndex = index ; addIndex < names . length ; addIndex ++ ) {
89
- this . addSegment ( names [ addIndex ] ) ;
92
+ isDiff = true ;
93
+ }
94
+ }
90
95
}
91
96
92
- return true ;
97
+ this . setChangeNumber ( segmentsData . cn ) ;
98
+ return isDiff ;
93
99
}
94
100
}
0 commit comments