///|
/// Calculates the inverse of a function
pub fn func_inv(
  target : Double,
  f : (Double) -> Double,
  d : (Double) -> Double,
  initial_guess : Double,
  max_iterations~ : Int = 100,
  tol~ : Double = 1.0e-12,
) -> Double? {
  let mut x = initial_guess
  for iter in 0.. Double,
  min_range : Double,
  max_range : Double,
  max_iterations~ : Int = 200,
  tol~ : Double = 1.0e-14,
  monotonicity : String,
) -> Double? {
  if monotonicity != "I" && monotonicity != "D" {
    return None
  }
  let mut left = min_range
  let mut right = max_range
  let f_left = f(left)
  let f_right = f(right)
  let target_in_range = match monotonicity {
    "I" => f_left <= target && target <= f_right
    "D" => f_right <= target && target <= f_left
    _ => false
  }
  if not(target_in_range) {
    return None
  }
  for iter in 0.. if f_mid < target { left = mid } else { right = mid }
      "D" => if f_mid > target { left = mid } else { right = mid }
      _ => return None
    }
    if (right - left).abs() < tol {
      return Some((left + right) / 2.0)
    }
  }
  None
}