use std::collections::{HashMap, HashSet};
use autocxx_parser::TypeConfig;
use crate::{conversion::api::Api, types::TypeName};
use super::fun::FnAnalysis;
pub(crate) fn filter_apis_by_following_edges_from_allowlist(
mut apis: Vec<Api<FnAnalysis>>,
type_config: &TypeConfig,
) -> Vec<Api<FnAnalysis>> {
let mut todos: Vec<_> = apis
.iter()
.filter(|api| {
let tnforal = api.typename_for_allowlist();
type_config.is_on_allowlist(&tnforal.to_cpp_name())
})
.map(Api::typename)
.collect();
let mut by_typename: HashMap<TypeName, Vec<Api<FnAnalysis>>> = HashMap::new();
for api in apis.drain(..) {
let tn = api.typename();
by_typename.entry(tn).or_default().push(api);
}
let mut done = HashSet::new();
let mut output = Vec::new();
while !todos.is_empty() {
let todo = todos.remove(0);
if done.contains(&todo) {
continue;
}
if let Some(mut these_apis) = by_typename.remove(&todo) {
todos.extend(these_apis.iter().flat_map(|api| api.deps.iter().cloned()));
output.append(&mut these_apis);
} done.insert(todo);
}
output
}