///|
/// A half-open source range in a rule expression.
pub(all) struct Span {
  start : Int
  end : Int
} derive(Eq, Debug, ToJson, FromJson)

///|
pub fn Span::new(start : Int, end : Int) -> Span {
  { start, end }
}

///|
pub fn Span::merge(self : Span, other : Span) -> Span {
  {
    start: Int::min(self.start, other.start),
    end: Int::max(self.end, other.end),
  }
}

///|
pub fn Span::length(self : Span) -> Int {
  self.end - self.start
}