use arena_traits::Arena;
use relooper::{RelooperLabel, ShapedBlock};
use ssa_impls::dom::dominates;
use ssa_traits::Func;
use ssa_traits::Block;
use ssa_traits::Term;
use ssa_traits::Target;
pub fn go<F: Func<Block: RelooperLabel>>(b: &F, k: F::Block) -> Box<ShapedBlock<F::Block>> {
let cfg = ssa_impls::dom::domtree(b);
relooper::reloop(
b.blocks().iter()
.filter(|k| dominates::<F>(&cfg,Some(b.entry()), Some(*k)))
.map(|k| {
let l = &b.blocks()[k];
(
k,
l.term().targets()
.map(|a|a.block())
.chain(b.blocks().iter().filter(|x| dominates::<F>(&cfg,Some(*x), Some(k))))
.collect(),
)
})
.collect(),
k,
)
}