///|
typealias Int as Index

///|
priv struct Range((Index, Index)) derive(Eq, Show)

///|
fn subset(r1 : Range, r2 : Range) -> Bool {
  let (a1, b1) = r1.inner()
  let (a2, b2) = r2.inner()
  a1 >= a2 && b1 <= b2
}

///|
fn contains(self : Range, i : Index) -> Bool {
  subset((i, i), self)
}

///|
fn disjoint(r1 : Range, r2 : Range) -> Bool {
  let (a1, b1) = r1.inner()
  let (a2, b2) = r2.inner()
  b1 < a2 || b2 < a1
}