Add spawn facilities to `AsyncWindowContext`

Antonio Scandurra created

Change summary

crates/gpui2/src/app/async_context.rs | 35 +++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)

Detailed changes

crates/gpui2/src/app/async_context.rs 🔗

@@ -183,6 +183,41 @@ impl AsyncWindowContext {
         self.app
             .update_window(self.window, |cx| cx.update_global(update))
     }
+
+    pub fn spawn<Fut, R>(
+        &self,
+        f: impl FnOnce(AsyncWindowContext) -> Fut + Send + 'static,
+    ) -> Task<R>
+    where
+        Fut: Future<Output = R> + Send + 'static,
+        R: Send + 'static,
+    {
+        let this = self.clone();
+        self.executor.spawn(async move { f(this).await })
+    }
+
+    pub fn spawn_on_main<Fut, R>(
+        &self,
+        f: impl FnOnce(AsyncWindowContext) -> Fut + Send + 'static,
+    ) -> Task<R>
+    where
+        Fut: Future<Output = R> + 'static,
+        R: Send + 'static,
+    {
+        let this = self.clone();
+        self.executor.spawn_on_main(|| f(this))
+    }
+
+    pub fn run_on_main<R>(
+        &self,
+        f: impl FnOnce(&mut MainThread<WindowContext>) -> R + Send + 'static,
+    ) -> Task<Result<R>>
+    where
+        R: Send + 'static,
+    {
+        self.update(|cx| cx.run_on_main(f))
+            .unwrap_or_else(|error| Task::ready(Err(error)))
+    }
 }
 
 impl Context for AsyncWindowContext {