turbo_tasks/
completion.rs1use anyhow::Result;
2
3use crate::{self as turbo_tasks, ResolvedVc, TryJoinIterExt, Vc};
4
5#[turbo_tasks::value(cell = "new", eq = "manual")]
14#[derive(Debug)]
15pub struct Completion;
16
17#[turbo_tasks::value_impl]
18impl Completion {
19 #[turbo_tasks::function]
21 pub fn immutable() -> Vc<Self> {
22 Completion::cell(Completion)
23 }
24}
25
26impl Completion {
29 pub fn new() -> Vc<Self> {
31 Completion::cell(Completion)
32 }
33}
34
35#[turbo_tasks::value(transparent)]
36pub struct Completions(Vec<ResolvedVc<Completion>>);
37
38#[turbo_tasks::value_impl]
39impl Completions {
40 #[turbo_tasks::function]
42 pub async fn completed(&self) -> anyhow::Result<Vc<Completion>> {
43 if self.0.len() > 100 {
44 let mid = self.0.len() / 2;
45 let (left, right) = self.0.split_at(mid);
46 let left = Vc::<Completions>::cell(left.to_vec());
47 let right = Vc::<Completions>::cell(right.to_vec());
48 let left = left.completed();
49 let right = right.completed();
50 left.await?;
51 right.await?;
52 Ok(Completion::new())
53 } else {
54 self.0
55 .iter()
56 .map(|&c| async move {
57 wrap(*c).await?;
60 Ok(())
61 })
62 .try_join()
63 .await?;
64 Ok(Completion::new())
65 }
66 }
67}
68
69#[turbo_tasks::function]
70async fn wrap(completion: Vc<Completion>) -> Result<Vc<Completion>> {
71 completion.await?;
72 Ok(Completion::new())
73}