use crate::array::*;
use crate::finite_function::*;
use crate::strict::graph;
use crate::strict::graph::converse_iter;
use crate::strict::open_hypergraph::*;
pub fn layer<K: ArrayKind, O, A>(f: &OpenHypergraph<K, O, A>) -> (FiniteFunction<K>, K::Type<K::I>)
where
K::Type<A>: Array<K, A>,
K::Type<K::I>: NaturalArray<K>,
{
let a = graph::operation_adjacency(&f.h);
let (ordering, completed) = graph::kahn(&a);
(
FiniteFunction::new(ordering, f.h.x.0.len()).unwrap(),
completed,
)
}
pub fn layered_operations<K: ArrayKind, O, A>(
f: &OpenHypergraph<K, O, A>,
) -> (Vec<K::Index>, K::Index)
where
K::Type<A>: Array<K, A>,
K::Type<K::I>: NaturalArray<K>,
K::I: Into<usize>,
{
let (order, unvisited) = layer(f);
(converse_iter(order).collect(), unvisited.into())
}