///|
fn invalid_linkage_score(value : Double) -> Bool {
  value.is_nan() || value.is_inf() || value < 0.0 || value > 1.0
}

///|
/// Validates nested matching, blocking, work-limit, and score settings.
pub fn validate_linkage_config(
  config : LinkageConfig,
) -> Result[Unit, LinkageError] {
  match validate_match_config(config.match_config) {
    Err(error) => return Err(InvalidLinkageMatchConfig(error))
    Ok(_) => ()
  }
  if config.blocking_algorithms.length() == 0 {
    return Err(NoLinkageBlockingAlgorithms)
  }
  for index = 0; index < config.blocking_algorithms.length(); index = index + 1 {
    for earlier = 0; earlier < index; earlier = earlier + 1 {
      if config.blocking_algorithms[index] ==
        config.blocking_algorithms[earlier] {
        return Err(
          DuplicateLinkageBlockingAlgorithm(config.blocking_algorithms[index]),
        )
      }
    }
  }
  if config.max_candidates_per_left < 1 {
    return Err(InvalidLinkageCandidateLimit(config.max_candidates_per_left))
  }
  if invalid_linkage_score(config.minimum_score) {
    return Err(InvalidLinkageMinimumScore(config.minimum_score))
  }
  Ok(())
}