///|
// Counter spans are right-open intervals: [start, end).
pub struct CounterSpan {
  start : Counter
  end : Counter
} derive(Show, Eq)

///|
pub fn CounterSpan::new(start : Counter, end : Counter) -> CounterSpan {
  CounterSpan::{ start, end }
}

///|
pub fn CounterSpan::len(self : CounterSpan) -> Int {
  if self.end >= self.start {
    self.end - self.start
  } else {
    self.start - self.end
  }
}

///|
pub fn CounterSpan::normalize(self : CounterSpan) -> CounterSpan {
  if self.end >= self.start {
    self
  } else {
    CounterSpan::{ start: self.end, end: self.start }
  }
}

///|
pub fn CounterSpan::contains(self : CounterSpan, counter : Counter) -> Bool {
  let norm = self.normalize()
  norm.start <= counter && counter < norm.end
}

///|
// ID span for a peer over a counter range.
pub struct IdSpan {
  peer : PeerID
  counter : CounterSpan
} derive(Show, Eq)

///|
pub fn IdSpan::new(peer : PeerID, start : Counter, end : Counter) -> IdSpan {
  IdSpan::{ peer, counter: CounterSpan::new(start, end) }
}