use num_traits::Float;
use strafe_type::{Finite64, FloatConstraint, LogProbability64, Probability64, Real64};
use crate::traits::DPQ;
pub fn qunif<P: Into<Probability64>, F1: Into<Finite64>, F2: Into<Finite64>>(
p: P,
a: F1,
b: F2,
lower_tail: bool,
) -> Real64 {
let p = p.into().unwrap();
qunif_inner(p, a, b, lower_tail, false)
}
pub fn log_qunif<LP: Into<LogProbability64>, F1: Into<Finite64>, F2: Into<Finite64>>(
p: LP,
a: F1,
b: F2,
lower_tail: bool,
) -> Real64 {
let p = p.into().unwrap();
qunif_inner(p, a, b, lower_tail, true)
}
fn qunif_inner<F1: Into<Finite64>, F2: Into<Finite64>>(
p: f64,
a: F1,
b: F2,
lower_tail: bool,
log: bool,
) -> Real64 {
let a = a.into().unwrap();
let b = b.into().unwrap();
if b < a {
return f64::nan().into();
}
if b == a {
return a.into();
}
(a + p.dt_qiv(lower_tail, log) * (b - a)).into()
}