From d59d5fbc54a8a3d39f2b62be5565b48892416367 Mon Sep 17 00:00:00 2001 From: Gnome! Date: Thu, 25 Jan 2024 18:42:39 +0000 Subject: [PATCH] Fix massive code size of `client::dispatch` (#2739) This replaces fancy iter stuff with just writing the code, and therefore reduces the code size significantly and spawns less tasks. --- src/client/dispatch.rs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/client/dispatch.rs b/src/client/dispatch.rs index 9451351af0e..6378d38c6f5 100644 --- a/src/client/dispatch.rs +++ b/src/client/dispatch.rs @@ -59,26 +59,33 @@ pub(crate) fn dispatch_model( event, ); - let iter = std::iter::once(full_event).chain(extra_event); for handler in event_handlers { - for event in iter.clone() { - let context = context.clone(); - let handler = Arc::clone(&handler); - spawn_named(event.snake_case_name(), async move { - event.dispatch(context, &*handler).await; - }); - } + let context = context.clone(); + let handler = Arc::clone(&handler); + let (full_event, extra_event) = (full_event.clone(), extra_event.clone()); + + spawn_named(full_event.snake_case_name(), async move { + if let Some(extra_event) = extra_event { + extra_event.dispatch(context.clone(), &*handler).await; + } + + full_event.dispatch(context, &*handler).await; + }); } #[cfg(feature = "framework")] if let Some(framework) = framework { - for event in iter { - let context = context.clone(); - let framework = Arc::clone(&framework); - spawn_named("dispatch::framework::dispatch", async move { - framework.dispatch(context, event).await; - }); - } + let context = context.clone(); + let framework = Arc::clone(&framework); + let (full_event, extra_event) = (full_event.clone(), extra_event.clone()); + + spawn_named("dispatch::framework::dispatch", async move { + if let Some(extra_event) = extra_event { + framework.dispatch(context.clone(), extra_event).await; + } + + framework.dispatch(context, full_event).await; + }); } }