@@ -160,6 +160,7 @@ function diffItems({ first, prevProps, ...state }, props) {
160160    trail =  0 , 
161161    unique, 
162162    config, 
163+     order =  [ 'added' ,  'removed' ,  'updated' ] , 
163164  }  =  get ( props ) 
164165  let  {  keys : _keys ,  items : _items  }  =  get ( prevProps ) 
165166  let  current  =  {  ...state . current  } 
@@ -174,62 +175,77 @@ function diffItems({ first, prevProps, ...state }, props) {
174175    . filter ( item  =>  ! item . destroyed  &&  ! nextSet . has ( item . originalKey ) ) 
175176    . map ( i  =>  i . originalKey ) 
176177  let  updated  =  keys . filter ( item  =>  currentSet . has ( item ) ) 
177-   let  delay  =  0 
178+   let  delay  =  - trail 
178179
179-   added . forEach ( ( key ,  index )  =>  { 
180-     // In unique mode, remove fading out transitions if their key comes in again 
181-     if  ( unique  &&  deleted . find ( d  =>  d . originalKey  ===  key ) ) 
182-       deleted  =  deleted . filter ( t  =>  t . originalKey  !==  key ) 
180+   while  ( order . length )  { 
181+     const  changeType  =  order . shift ( ) 
183182
184-     // TODO: trail shouldn't apply to the first item, no matter if it's enter, leave or update! 
185-     const  keyIndex  =  keys . indexOf ( key ) 
186-     const  item  =  items [ keyIndex ] 
187-     const  slot  =  first  &&  initial  !==  void  0  ? 'initial'  : 'enter' 
188-     current [ key ]  =  { 
189-       slot, 
190-       originalKey : key , 
191-       key : unique  ? String ( key )  : guid ++ , 
192-       item, 
193-       trail : ( delay  =  delay  +  ( index  >  0  ? trail  : 0 ) ) , 
194-       config : callProp ( config ,  item ,  slot ) , 
195-       from : callProp ( 
196-         first  ? ( initial  !==  void  0  ? initial  ||  { }  : from )  : from , 
197-         item 
198-       ) , 
199-       to : callProp ( enter ,  item ) , 
200-     } 
201-   } ) 
183+     switch  ( changeType )  { 
202184
203-   removed . forEach ( key  =>  { 
204-     const  keyIndex  =  _keys . indexOf ( key ) 
205-     const  item  =  _items [ keyIndex ] 
206-     const  slot  =  'leave' 
207-     deleted . unshift ( { 
208-       ...current [ key ] , 
209-       slot, 
210-       destroyed : true , 
211-       left : _keys [ Math . max ( 0 ,  keyIndex  -  1 ) ] , 
212-       right : _keys [ Math . min ( _keys . length ,  keyIndex  +  1 ) ] , 
213-       trail : ( delay  =  delay  +  trail ) , 
214-       config : callProp ( config ,  item ,  slot ) , 
215-       to : callProp ( leave ,  item ) , 
216-     } ) 
217-     delete  current [ key ] 
218-   } ) 
185+       case  'added' : { 
186+         added . forEach ( ( key ,  index )  =>  { 
187+           // In unique mode, remove fading out transitions if their key comes in again 
188+           if  ( unique  &&  deleted . find ( d  =>  d . originalKey  ===  key ) ) 
189+             deleted  =  deleted . filter ( t  =>  t . originalKey  !==  key ) 
219190
220-   updated . forEach ( key  =>  { 
221-     const  keyIndex  =  keys . indexOf ( key ) 
222-     const  item  =  items [ keyIndex ] 
223-     const  slot  =  'update' 
224-     current [ key ]  =  { 
225-       ...current [ key ] , 
226-       item, 
227-       slot, 
228-       trail : ( delay  =  delay  +  trail ) , 
229-       config : callProp ( config ,  item ,  slot ) , 
230-       to : callProp ( update ,  item ) , 
191+           // TODO: trail shouldn't apply to the first item, no matter if it's enter, leave or update! 
192+           const  keyIndex  =  keys . indexOf ( key ) 
193+           const  item  =  items [ keyIndex ] 
194+           const  slot  =  first  &&  initial  !==  void  0  ? 'initial'  : 'enter' 
195+           current [ key ]  =  { 
196+             slot, 
197+             originalKey : key , 
198+             key : unique  ? String ( key )  : guid ++ , 
199+             item, 
200+             trail : ( delay  =  delay  +  trail ) , 
201+             config : callProp ( config ,  item ,  slot ) , 
202+             from : callProp ( 
203+               first  ? ( initial  !==  void  0  ? initial  ||  { }  : from )  : from , 
204+               item 
205+             ) , 
206+             to : callProp ( enter ,  item ) , 
207+           } 
208+         } ) 
209+         break 
210+       } 
211+       case  'removed' : { 
212+         removed . forEach ( key  =>  { 
213+           const  keyIndex  =  _keys . indexOf ( key ) 
214+           const  item  =  _items [ keyIndex ] 
215+           const  slot  =  'leave' 
216+           deleted . unshift ( { 
217+             ...current [ key ] , 
218+             slot, 
219+             destroyed : true , 
220+             left : _keys [ Math . max ( 0 ,  keyIndex  -  1 ) ] , 
221+             right : _keys [ Math . min ( _keys . length ,  keyIndex  +  1 ) ] , 
222+             trail : ( delay  =  delay  +  trail ) , 
223+             config : callProp ( config ,  item ,  slot ) , 
224+             to : callProp ( leave ,  item ) , 
225+           } ) 
226+           delete  current [ key ] 
227+         } ) 
228+         break 
229+       } 
230+       case  'updated' : { 
231+         updated . forEach ( key  =>  { 
232+           const  keyIndex  =  keys . indexOf ( key ) 
233+           const  item  =  items [ keyIndex ] 
234+           const  slot  =  'update' 
235+           current [ key ]  =  { 
236+             ...current [ key ] , 
237+             item, 
238+             slot, 
239+             trail : ( delay  =  delay  +  trail ) , 
240+             config : callProp ( config ,  item ,  slot ) , 
241+             to : callProp ( update ,  item ) , 
242+           } 
243+         } ) 
244+         break 
245+       } 
231246    } 
232-   } ) 
247+   } 
248+ 
233249
234250  let  out  =  keys . map ( key  =>  current [ key ] ) 
235251
0 commit comments