@@ -105,4 +105,41 @@ describe('Custom equality', () => {
105
105
expect ( outerFn ) . toBeCalledTimes ( 2 ) ;
106
106
expect ( cutoff ) . toBeCalledTimes ( 2 ) ;
107
107
} ) ;
108
+
109
+ it ( 'should not call equal multiple times for the same comparison' , ( ) => {
110
+ let equalCalls : [ number , number ] [ ] = [ ] ;
111
+ const equals = ( a : number , b : number ) => {
112
+ equalCalls . push ( [ a , b ] ) ;
113
+ return a === b ;
114
+ } ;
115
+ const s = new Signal . State < number > ( 0 , { equals} ) ;
116
+ let n1 = 0 ;
117
+ let n2 = 0 ;
118
+ const c1 = new Signal . Computed ( ( ) => ( n1 ++ , s . get ( ) ) ) ;
119
+ const c2 = new Signal . Computed ( ( ) => ( n2 ++ , s . get ( ) ) ) ;
120
+ expect ( equalCalls ) . toEqual ( [ ] ) ;
121
+ expect ( n1 ) . toBe ( 0 ) ;
122
+ expect ( c1 . get ( ) ) . toBe ( 0 ) ;
123
+ expect ( n1 ) . toBe ( 1 ) ;
124
+ expect ( n2 ) . toBe ( 0 ) ;
125
+ expect ( c2 . get ( ) ) . toBe ( 0 ) ;
126
+ expect ( n2 ) . toBe ( 1 ) ;
127
+ s . set ( 1 ) ;
128
+ expect ( equalCalls ) . toEqual ( [ [ 0 , 1 ] ] ) ;
129
+ equalCalls = [ ] ;
130
+ expect ( n1 ) . toBe ( 1 ) ;
131
+ expect ( n2 ) . toBe ( 1 ) ;
132
+ s . set ( 0 ) ;
133
+ expect ( equalCalls ) . toEqual ( [ [ 1 , 0 ] ] ) ;
134
+ equalCalls = [ ] ;
135
+ expect ( n1 ) . toBe ( 1 ) ;
136
+ expect ( n2 ) . toBe ( 1 ) ;
137
+ expect ( c1 . get ( ) ) . toBe ( 0 ) ; // the last time c1 was computed was with s = 0, no need to recompute
138
+ expect ( equalCalls ) . toEqual ( [ [ 0 , 0 ] ] ) ; // equal should have been called
139
+ equalCalls = [ ] ;
140
+ expect ( c2 . get ( ) ) . toBe ( 0 ) ; // the last time c2 was computed was with s = 0, no need to recompute
141
+ expect ( equalCalls ) . toEqual ( [ ] ) ; // equal should not have been called again
142
+ expect ( n1 ) . toBe ( 1 ) ;
143
+ expect ( n2 ) . toBe ( 1 ) ;
144
+ } ) ;
108
145
} ) ;
0 commit comments