use failure::Fallible;
use crate::algorithms::{reverse, reweight, shortest_distance, ReweightType};
use crate::fst_traits::{ExpandedFst, Fst, MutableFst};
use crate::semirings::WeaklyDivisibleSemiring;
pub fn push_weights<F>(fst: &mut F, reweight_type: ReweightType) -> Fallible<()>
where
F: Fst + ExpandedFst + MutableFst,
F::W: WeaklyDivisibleSemiring,
{
match reweight_type {
ReweightType::ReweightToInitial => {
let fst_reversed: F = reverse(fst)?;
let dist = shortest_distance(&fst_reversed)?;
reweight(fst, &dist, ReweightType::ReweightToInitial)
}
ReweightType::ReweightToFinal => {
let dist = shortest_distance(fst)?;
reweight(fst, &dist, ReweightType::ReweightToFinal)
}
}
}