///|
pub struct CapeCodResult {
  priv rate : Double
  priv adjusted_exposure : Double
  priv estimate : Estimate
}

///|
pub fn CapeCodResult::rate(self : CapeCodResult) -> Double {
  self.rate
}

///|
pub fn CapeCodResult::adjusted_exposure(self : CapeCodResult) -> Double {
  self.adjusted_exposure
}

///|
pub fn CapeCodResult::estimate(self : CapeCodResult) -> Estimate {
  self.estimate
}

///|
/// Exposures share one unit and must be positive. Rate is fitted to paid claims.
pub fn cape_cod(
  triangle : Triangle,
  pattern : Pattern,
  exposure : Array[Double],
) -> CapeCodResult raise RunoffError {
  compatible(triangle, pattern)
  validate_prior(exposure, triangle.order())
  let mut paid = 0.0
  let mut adjusted_exposure = 0.0
  for i in 0..