@@ -20,7 +20,7 @@ pub use route_weekday::RouteWeekday;
2020pub use trace:: { RouteTrace , Trace } ;
2121
2222use core:: cmp:: Reverse ;
23- use std:: collections:: HashMap ;
23+ use std:: collections:: { HashMap , HashSet } ;
2424use std:: sync:: Arc ;
2525
2626#[ derive( Debug , Clone ) ]
@@ -76,6 +76,11 @@ impl<T> Router<T> {
7676 }
7777 }
7878
79+ pub fn batch_remove ( & mut self , ids : & HashSet < String > ) {
80+ self . routes . retain ( |id, _| !ids. contains ( id) ) ;
81+ self . matcher . batch_remove ( ids) ;
82+ }
83+
7984 pub fn rebuild_request ( & self , request : & Request ) -> Request {
8085 Request :: rebuild_with_config ( self . config . as_ref ( ) , request)
8186 }
@@ -154,16 +159,17 @@ where
154159 self . insert_route ( item. into_route ( self . config . as_ref ( ) ) ) ;
155160 }
156161
157- pub fn apply_change_set ( & mut self , added : Vec < T > , updated : Vec < T > , removed : Vec < String > ) {
158- for id in removed {
159- self . remove ( id. as_str ( ) ) ;
160- }
162+ pub fn apply_change_set ( & mut self , added : Vec < T > , updated : Vec < T > , mut removed : HashSet < String > ) {
163+ let updated_route = updated
164+ . into_iter ( )
165+ . map ( |item| item. into_route ( self . config . as_ref ( ) ) )
166+ . collect :: < Vec < Route < T > > > ( ) ;
161167
162- for item in updated {
163- let route = item . into_route ( self . config . as_ref ( ) ) ;
168+ removed . extend ( updated_route . iter ( ) . map ( | item| item . id ( ) . to_string ( ) ) ) ;
169+ self . batch_remove ( & removed ) ;
164170
165- self . remove ( route . id ( ) ) ;
166- self . insert_route ( route ) ;
171+ for item in updated_route {
172+ self . insert_route ( item ) ;
167173 }
168174
169175 for item in added {
0 commit comments