///|
pub struct Epoch {
  seconds_since_j2000 : Double
} derive(Debug, Eq)

///|
pub fn Epoch::j2000() -> Epoch {
  { seconds_since_j2000: 0.0 }
}

///|
pub fn Epoch::from_seconds(seconds_since_j2000 : Double) -> Epoch {
  { seconds_since_j2000, }
}

///|
pub fn Epoch::from_days(days_since_j2000 : Double) -> Epoch {
  { seconds_since_j2000: days_since_j2000 * 86400.0 }
}

///|
pub fn Epoch::add_seconds(epoch : Epoch, seconds : Double) -> Epoch {
  { seconds_since_j2000: epoch.seconds_since_j2000 + seconds }
}

///|
pub fn Epoch::duration_to(a : Epoch, b : Epoch) -> Double {
  b.seconds_since_j2000 - a.seconds_since_j2000
}

///|
pub fn Epoch::days_since_j2000(epoch : Epoch) -> Double {
  epoch.seconds_since_j2000 / 86400.0
}

///|
pub fn gmst(epoch : Epoch) -> Double {
  normalize_angle(
    4.894961212823756 + earth_rotation_rad_s * epoch.seconds_since_j2000,
  )
}