///|
pub enum SuspensionError {
  Reversed
  OutOfRange
  Aborted
} derive(Debug, Eq, Compare)

///|
pub enum SuspensionPolicy {
  PauseInclusive
  PauseExclusive
} derive(Debug, Eq, Compare)

///|
pub fn SuspensionPolicy::pause_inclusive() -> SuspensionPolicy {
  PauseInclusive
}

///|
pub fn SuspensionPolicy::pause_exclusive() -> SuspensionPolicy {
  PauseExclusive
}

///|
pub struct SuspensionPeriod {
  start : Date
  end : Date
} derive(Debug, Eq, Compare)

///|
pub fn SuspensionPeriod::new(
  start~ : Date,
  end~ : Date,
) -> Result[SuspensionPeriod, SuspensionError] {
  if start > end {
    Err(Reversed)
  } else {
    Ok({ start, end })
  }
}

///|
pub fn SuspensionPeriod::start(self : SuspensionPeriod) -> Date {
  self.start
}

///|
pub fn SuspensionPeriod::end(self : SuspensionPeriod) -> Date {
  self.end
}

///|
pub struct SuspensionSet {
  periods : Array[SuspensionPeriod]
  policy : SuspensionPolicy
  abort_on : Date?
} derive(Debug)

///|
pub fn SuspensionSet::new(
  periods~ : Array[SuspensionPeriod],
  policy? : SuspensionPolicy = PauseInclusive,
  abort_on? : Date,
) -> SuspensionSet {
  { periods: periods.copy(), policy, abort_on }
}

///|
pub fn SuspensionSet::periods(self : SuspensionSet) -> Array[SuspensionPeriod] {
  self.periods.copy()
}

///|
pub fn SuspensionSet::policy(self : SuspensionSet) -> SuspensionPolicy {
  self.policy
}

///|
pub fn SuspensionSet::abort_on(self : SuspensionSet) -> Date? {
  self.abort_on
}