Rest/Fn/Binary/Command/
Parallel.rs1pub async fn Fn(Option { Entry, Separator, Pattern, .. }:Option) {
35 let (Allow, mut Mark) = tokio::sync::mpsc::unbounded_channel();
36
37 let Queue = futures::stream::FuturesUnordered::new();
38
39 let glob = globset::Glob::new(&Pattern).expect("Invalid pattern").compile_matcher();
40
41 for Entry in Entry
42 .into_par_iter()
43 .filter_map(|Entry| {
44 if glob.is_match(&Entry.join(&Separator.to_string())) {
45 Some(Entry[0..Entry.len() - 1].join(&Separator.to_string()))
46 } else {
47 None
48 }
49 })
50 .collect::<Vec<String>>()
51 {
52 let Allow = Allow.clone();
53
54 Queue.push(tokio::spawn(async move {
55 match crate::Fn::Build::Fn(&Entry).await {
56 Ok(Build) => {
57 if let Err(_Error) = Allow.send((Entry, format!("{:?}", Build))) {
58 eprintln!("Cannot Allow: {}", _Error);
59 }
60 },
61
62 Err(_Error) => {
63 eprintln!("Cannot Build for {}: {}", Entry, _Error)
64 },
65 }
66 }));
67 }
68
69 tokio::spawn(async move {
70 Queue.collect::<Vec<_>>().await;
71
72 drop(Allow);
73 });
74
75 let mut Output = Vec::new();
76
77 while let Some((Entry, Build)) = Mark.recv().await {
78 Output.push((Entry, Build));
79 }
80
81 crate::Fn::Build::Group::Fn(Output);
82}
83
84use futures::stream::StreamExt;
85use rayon::iter::{IntoParallelIterator, ParallelIterator};
86
87use crate::Struct::Binary::Command::Entry::Struct as Option;