///|
pub fn new[V : Compare, D]() -> T[V, D] {
  { root: None, size: 0, options: default_options() }
}

///|
/// Creates a new interval tree with options.
pub fn new_with_options[V : Compare, D](options : IntervalOptions) -> T[V, D] {
  { root: None, size: 0, options }
}

///|
/// Creates a new interval tree with a single interval.
pub fn singleton[V : Compare, D](
  interval : Interval[V],
  data : D,
  options~ : IntervalOptions = default_options()
) -> T[V, D] {
  // 直接创建包含一个节点的树,而不是修改现有树
  if is_valid_interval(interval) == false {
    return new_with_options(options)
  }
  let root_node = Some({
    interval,
    data,
    max_high: interval.high,
    left: None,
    right: None,
    height: 1,
  })
  { root: root_node, size: 1, options }
}

///|
/// Creates a new interval tree from an array of intervals and data.
pub fn from_array[V : Compare, D](
  intervals : Array[(Interval[V], D)],
  options~ : IntervalOptions = default_options()
) -> T[V, D] {
  // 使用折叠操作构建不可变树,而不是通过修改来构建
  intervals.fold(init=new_with_options(options), fn(tree, pair) {
    let (interval, data) = pair
    tree.insert(interval, data)
  })
}

///|
/// Inserts an interval with associated data into the tree.
/// Returns a new tree with the interval inserted.
pub fn insert[V : Compare, D](
  self : T[V, D],
  interval : Interval[V],
  data : D
) -> T[V, D] {
  // 验证区间
  if is_valid_interval(interval) == false {
    println("Invalid interval: low > high")
    return self
  }

  // 如果不允许重复且相同区间存在,则更新数据
  if self.options.allow_duplicates == false {
    // 检查是否有完全匹配的区间
    match self.find_exact(interval) {
      Some(_) =>
        // 在不可变实现中,我们需要创建一个新树,更新匹配节点的数据
        return self.replace_exact(interval, data)
      None => ignore(None)
    }
  }
  let new_node = {
    interval,
    data,
    max_high: interval.high,
    left: None,
    right: None,
    height: 1,
  }

  // 插入新节点
  // 修改insert函数中的代码片段
  match self.root {
    None =>
      // 创建一个只有根节点的新树
      return { root: Some(new_node), size: 1, options: self.options }
    Some(root) => {
      // 创建包含新节点的新树
      let insert_result = insert_node_immut(
        root,
        new_node,
        allow_duplicates=self.options.allow_duplicates,
      )
      if insert_result.inserted {
        return {
          root: Some(insert_result.node),
          size: self.size + 1,
          options: self.options,
        }
      } else {
        return {
          root: Some(insert_result.node),
          size: self.size,
          options: self.options,
        }
      }
    }
  }
}

///|
/// Represents the result of an immutable insert operation
pub struct InsertResult[V, D] {
  node : Node[V, D]
  inserted : Bool
}

///|
/// Immutable version of insert_node
///|
/// Immutable version of insert_node
pub fn insert_node_immut[V : Compare, D](
  node : Node[V, D],
  new_node : Node[V, D],
  allow_duplicates~ : Bool = false
) -> InsertResult[V, D] {
  // 使用低端点作为BST键
  let comp = new_node.interval.low.compare(node.interval.low)

  // 插入到左子树
  if comp < 0 {
    match node.left {
      None => {
        // 创建新节点,左子树设置为new_node
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: Some(new_node),
          right: node.right,
          height: node.height,
        }
        let result_node = update_height_and_max_high_immut(updated_node)
        { node: result_node, inserted: true }
      }
      Some(left) => {
        let insert_result = insert_node_immut(left, new_node, allow_duplicates~)
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: Some(insert_result.node),
          right: node.right,
          height: node.height,
        }
        if insert_result.inserted {
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced = balance_immut(height_updated)
          { node: balanced, inserted: true }
        } else {
          { node: updated_node, inserted: false }
        }
      }
    }
    // 插入到右子树
  } else if comp > 0 {
    match node.right {
      None => {
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: node.left,
          right: Some(new_node),
          height: node.height,
        }
        let result_node = update_height_and_max_high_immut(updated_node)
        { node: result_node, inserted: true }
      }
      Some(right) => {
        let insert_result = insert_node_immut(
          right,
          new_node,
          allow_duplicates~,
        )
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: node.left,
          right: Some(insert_result.node),
          height: node.height,
        }
        if insert_result.inserted {
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced = balance_immut(height_updated)
          { node: balanced, inserted: true }
        } else {
          { node: updated_node, inserted: false }
        }
      }
    }
    // 区间完全相同,根据allow_duplicates决定更新还是添加
  } else if new_node.interval.high == node.interval.high {
    if allow_duplicates {
      // 如果允许重复,将新节点添加到右子树,视为"大于"当前节点
      match node.right {
        None => {
          let updated_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: node.left,
            right: Some(new_node),
            height: node.height,
          }
          let result_node = update_height_and_max_high_immut(updated_node)
          { node: result_node, inserted: true }
        }
        Some(right) => {
          let insert_result = insert_node_immut(
            right,
            new_node,
            allow_duplicates~,
          )
          let updated_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: node.left,
            right: Some(insert_result.node),
            height: node.height,
          }
          if insert_result.inserted {
            let height_updated = update_height_and_max_high_immut(updated_node)
            let balanced = balance_immut(height_updated)
            { node: balanced, inserted: true }
          } else {
            { node: updated_node, inserted: false }
          }
        }
      }
    } else {
      // 不允许重复,只更新数据
      let updated_node = {
        interval: node.interval,
        data: new_node.data, // 更新数据
        max_high: node.max_high,
        left: node.left,
        right: node.right,
        height: node.height,
      }
      { node: updated_node, inserted: false }
    }
  } else {
    // 相同低端点但不同高端点,应该插入到右子树
    match node.right {
      None => {
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: node.left,
          right: Some(new_node),
          height: node.height,
        }
        let result_node = update_height_and_max_high_immut(updated_node)
        { node: result_node, inserted: true }
      }
      Some(right) => {
        let insert_result = insert_node_immut(
          right,
          new_node,
          allow_duplicates~,
        )
        let updated_node = {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: node.left,
          right: Some(insert_result.node),
          height: node.height,
        }
        if insert_result.inserted {
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced = balance_immut(height_updated)
          { node: balanced, inserted: true }
        } else {
          { node: updated_node, inserted: false }
        }
      }
    }
  }
}

///|
/// Update height and max_high for a node (immutable version)
pub fn update_height_and_max_high_immut[V : Compare, D](
  node : Node[V, D]
) -> Node[V, D] {
  // 计算新的高度
  let new_height = 1 +
    @math.maximum(
      match node.left {
        Some(left) => left.height
        None => 0
      },
      match node.right {
        Some(right) => right.height
        None => 0
      },
    )

  // 计算新的max_high
  let mut new_max_high = node.interval.high
  match node.left {
    Some(left) =>
      if left.max_high.compare(new_max_high) > 0 {
        new_max_high = left.max_high
      }
    None => ignore(None)
  }
  match node.right {
    Some(right) =>
      if right.max_high.compare(new_max_high) > 0 {
        new_max_high = right.max_high
      }
    None => ignore(None)
  }

  // 创建并返回新节点
  {
    interval: node.interval,
    data: node.data,
    max_high: new_max_high, // 更新max_high
    left: node.left,
    right: node.right,
    height: new_height, // 更新height
  }
}

///|
/// Helper function to clone a node
pub fn clone_node[V, D](node : Node[V, D]) -> Node[V, D] {
  {
    interval: node.interval,
    data: node.data,
    max_high: node.max_high,
    left: node.left,
    right: node.right,
    height: node.height,
  }
}

///|
/// Right rotation (immutable version)
pub fn right_rotate_immut[V : Compare, D](y : Node[V, D]) -> Node[V, D] {
  match y.left {
    Some(x) => {
      let t2 = x.right

      // 创建新节点,使用记录更新语法替代字段修改
      let new_y = {
        interval: y.interval,
        data: y.data,
        max_high: y.max_high,
        left: t2,
        right: y.right,
        height: y.height,
      }

      // 更新高度和max_high
      let updated_y = update_height_and_max_high_immut(new_y)

      // 创建新的x节点,右子树指向更新后的y
      let new_x = {
        interval: x.interval,
        data: x.data,
        max_high: x.max_high,
        left: x.left,
        right: Some(updated_y),
        height: x.height,
      }

      // 更新x的高度和max_high
      update_height_and_max_high_immut(new_x)
    }
    None =>
      // 理论上不应该发生
      y
  }
}

///|
/// Left rotation (immutable version)
pub fn left_rotate_immut[V : Compare, D](x : Node[V, D]) -> Node[V, D] {
  match x.right {
    Some(y) => {
      let t2 = y.left

      // 创建新节点,使用记录更新语法替代字段修改
      let new_x = {
        interval: x.interval,
        data: x.data,
        max_high: x.max_high,
        left: x.left,
        right: t2,
        height: x.height,
      }

      // 更新高度和max_high
      let updated_x = update_height_and_max_high_immut(new_x)

      // 创建新的y节点,左子树指向更新后的x
      let new_y = {
        interval: y.interval,
        data: y.data,
        max_high: y.max_high,
        left: Some(updated_x),
        right: y.right,
        height: y.height,
      }

      // 更新y的高度和max_high
      update_height_and_max_high_immut(new_y)
    }
    None =>
      // 理论上不应该发生
      x
  }
}

///|
/// Removes an interval from the tree.
/// Returns a new tree with the interval removed.
pub fn remove[V : Compare, D](
  self : T[V, D],
  interval : Interval[V]
) -> T[V, D] {
  match self.root {
    None => self
    Some(root) => {
      let result = remove_node_immut(root, interval)
      if result.removed {
        return { root: result.node, size: self.size - 1, options: self.options }
      } else {
        return self
      }
    }
  }
}

///|
/// Result of removing a node
pub struct RemoveResult[V, D] {
  node : Node[V, D]?
  removed : Bool
}

///|
///|
/// Immutable version of remove_node
pub fn remove_node_immut[V : Compare, D](
  node : Node[V, D],
  interval : Interval[V]
) -> RemoveResult[V, D] {
  let comp = interval.low.compare(node.interval.low)

  // 在左子树中搜索
  if comp < 0 {
    match node.left {
      None => { node: Some(node), removed: false }
      Some(left) => {
        let result = remove_node_immut(left, interval)
        if result.removed {
          // 创建带有更新左子树的新节点
          let updated_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: result.node, // 更新左子树
            right: node.right,
            height: node.height,
          }
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced_node = balance_immut(height_updated)
          { node: Some(balanced_node), removed: true }
        } else {
          { node: Some(node), removed: false }
        }
      }
    }
    // 在右子树中搜索
  } else if comp > 0 {
    match node.right {
      None => { node: Some(node), removed: false }
      Some(right) => {
        let result = remove_node_immut(right, interval)
        if result.removed {
          // 创建带有更新右子树的新节点
          let updated_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: node.left,
            right: result.node, // 更新右子树
            height: node.height,
          }
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced_node = balance_immut(height_updated)
          { node: Some(balanced_node), removed: true }
        } else {
          { node: Some(node), removed: false }
        }
      }
    }
    // 找到了相同低端点的节点,检查高端点
  } else if node.interval.high != interval.high {
    // 相同的低端点但不同的高端点,可能在子树中
    match node.right {
      None => { node: Some(node), removed: false }
      Some(right) => {
        let result = remove_node_immut(right, interval)
        if result.removed {
          // 创建带有更新右子树的新节点
          let updated_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: node.left,
            right: result.node, // 更新右子树
            height: node.height,
          }
          let height_updated = update_height_and_max_high_immut(updated_node)
          let balanced_node = balance_immut(height_updated)
          { node: Some(balanced_node), removed: true }
        } else {
          { node: Some(node), removed: false }
        }
      }
    }
  } else {
    // 找到要删除的节点
    match (node.left, node.right) {
      // 情况1:叶子节点
      (None, None) => { node: None, removed: true }
      // 情况2a:只有右子节点
      (None, Some(_)) => { node: node.right, removed: true }
      // 情况2b:只有左子节点
      (Some(_), None) => { node: node.left, removed: true }
      // 情况3:有两个子节点
      (Some(_), Some(right)) => {
        // 找到右子树中的最小节点
        let successor = find_min_immut(right)

        // 创建一个新节点,使用后继节点的值
        let new_node = {
          interval: successor.interval, // 使用后继节点的区间
          data: successor.data, // 使用后继节点的数据
          max_high: node.max_high,
          left: node.left,
          right: node.right,
          height: node.height,
        }

        // 从右子树中删除后继节点
        let result = remove_node_immut(right, successor.interval)

        // 创建更新了右子树的新节点
        let node_with_right_updated = {
          interval: new_node.interval,
          data: new_node.data,
          max_high: new_node.max_high,
          left: new_node.left,
          right: result.node, // 更新后的右子树
          height: new_node.height,
        }

        // 更新高度和max_high,然后平衡
        let updated_node = update_height_and_max_high_immut(
          node_with_right_updated,
        )
        let balanced_node = balance_immut(updated_node)
        { node: Some(balanced_node), removed: true }
      }
    }
  }
}

///|
/// Finds the node with the minimum value in the subtree (immutable version)
pub fn find_min_immut[V, D](node : Node[V, D]) -> Node[V, D] {
  match node.left {
    None => node
    Some(left) => find_min_immut(left)
  }
}

///|
/// Replace data for an exactly matching interval
pub fn replace_exact[V : Compare, D](
  self : T[V, D],
  interval : Interval[V],
  new_data : D
) -> T[V, D] {
  match self.root {
    None => self
    Some(root) => {
      let updated_root = replace_exact_helper(root, interval, new_data)
      return {
        root: Some(updated_root),
        size: self.size,
        options: self.options,
      }
    }
  }
}

///|
/// Finds an exact match for an interval in the tree
pub fn find_exact[V : Compare, D](self : T[V, D], interval : Interval[V]) -> D? {
  match self.root {
    None => None
    Some(root) => find_exact_in_node(root, interval)
  }
}

///|
/// Helper function to find an exact interval match in a node
pub fn find_exact_in_node[V : Compare, D](
  node : Node[V, D],
  query : Interval[V]
) -> D? {
  let low_comp = query.low.compare(node.interval.low)
  if low_comp == 0 && query.high == node.interval.high {
    // Found an exact match
    return Some(node.data)
  } else if low_comp < 0 {
    // Try left subtree
    match node.left {
      Some(left) => find_exact_in_node(left, query)
      None => None
    }
  } else {
    // Try right subtree
    match node.right {
      Some(right) => find_exact_in_node(right, query)
      None => None
    }
  }
}

///|
/// Helper for replace_exact
///|
/// Helper for replace_exact
pub fn replace_exact_helper[V : Compare, D](
  node : Node[V, D],
  query : Interval[V],
  new_data : D
) -> Node[V, D] {
  let low_comp = query.low.compare(node.interval.low)

  // 找到完全匹配的节点,创建新节点并更新数据
  if low_comp == 0 && query.high == node.interval.high {
    return {
      interval: node.interval,
      data: new_data, // 只更新数据字段
      max_high: node.max_high,
      left: node.left,
      right: node.right,
      height: node.height,
    }
  }

  // 没找到匹配节点,继续在适当的子树中搜索并更新
  if low_comp < 0 {
    match node.left {
      Some(left) => {
        let updated_left = replace_exact_helper(left, query, new_data)
        // 创建新节点,更新左子树
        return {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: Some(updated_left), // 更新左子树
          right: node.right,
          height: node.height,
        }
      }
      None => return node // 没有左子树,无需更新
    }
  } else {
    match node.right {
      Some(right) => {
        let updated_right = replace_exact_helper(right, query, new_data)
        // 创建新节点,更新右子树
        return {
          interval: node.interval,
          data: node.data,
          max_high: node.max_high,
          left: node.left,
          right: Some(updated_right), // 更新右子树
          height: node.height,
        }
      }
      None => return node // 没有右子树,无需更新
    }
  }
}

///|
/// Clears all intervals from the tree.
/// Returns a new empty tree with the same options.
pub fn clear[V : Compare, D](self : T[V, D]) -> T[V, D] {
  new_with_options(self.options)
}

///|
/// Checks if the interval is valid (low <= high)
pub fn is_valid_interval[V : Compare](interval : Interval[V]) -> Bool {
  // 检查区间的低端点是否不大于高端点
  interval.low.compare(interval.high) <= 0
}

///|
/// Balances a node in the AVL tree (immutable version)
pub fn balance_immut[V : Compare, D](node : Node[V, D]) -> Node[V, D] {
  // 计算平衡因子
  let balance = get_balance(node)

  // 左子树高 - 需要右旋或左右旋
  if balance > 1 {
    match node.left {
      Some(left) =>
        // 左-左情况:直接右旋
        if get_balance(left) >= 0 {
          return right_rotate_immut(node)
          // 左-右情况:先左旋左子树,再右旋节点
        } else {
          let new_left = left_rotate_immut(left)
          // 创建新节点,左子树设为new_left
          let new_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: Some(new_left), // 使用记录创建语法
            right: node.right,
            height: node.height,
          }
          return right_rotate_immut(new_node)
        }
      None => ignore(node) // 理论上不应该发生
    }
    // 右子树高 - 需要左旋或右左旋
  } else if balance < -1 {
    match node.right {
      Some(right) =>
        // 右-右情况:直接左旋
        if get_balance(right) <= 0 {
          return left_rotate_immut(node)
          // 右-左情况:先右旋右子树,再左旋节点
        } else {
          let new_right = right_rotate_immut(right)
          // 创建新节点,右子树设为new_right
          let new_node = {
            interval: node.interval,
            data: node.data,
            max_high: node.max_high,
            left: node.left,
            right: Some(new_right), // 使用记录创建语法
            height: node.height,
          }
          return left_rotate_immut(new_node)
        }
      None => ignore(node) // 理论上不应该发生
    }
  }

  // 节点已经平衡
  return node
}

///|
/// Gets the balance factor of a node
pub fn get_balance[V, D](node : Node[V, D]) -> Int {
  let left_height = match node.left {
    Some(left) => left.height
    None => 0
  }
  let right_height = match node.right {
    Some(right) => right.height
    None => 0
  }
  left_height - right_height
}

///|
/// 将树中的所有区间及其数据转换为数组
pub fn to_array[V : Compare, D](self : T[V, D]) -> Array[IntervalMatch[V, D]] {
  let results = []

  // 使用中序遍历收集所有节点
  fn traverse(node : Node[V, D]?) -> Unit {
    match node {
      None => ()
      Some(n) => {
        // 先遍历左子树
        traverse(n.left)

        // 处理当前节点
        results.push({ interval: n.interval, data: n.data })

        // 再遍历右子树
        traverse(n.right)
      }
    }
  }

  traverse(self.root)
  results
}

///|
/// 检查树中是否存在指定的区间
pub fn contains[V : Compare, D](self : T[V, D], interval : Interval[V]) -> Bool {
  match self.find_exact(interval) {
    Some(_) => true
    None => false
  }
}

///|
/// 查找被给定区间完全包含的所有区间
/// 返回包含匹配区间和数据的数组
pub fn find_contained[V : Compare, D](
  self : T[V, D],
  container : Interval[V]
) -> Array[IntervalMatch[V, D]] {
  let results = []
  match self.root {
    None => results
    Some(root) => {
      find_contained_helper(
        root,
        container,
        results,
        self.options.interval_type,
      )
      results
    }
  }
}

///|
/// Helper function for find_contained
fn find_contained_helper[V : Compare, D](
  node : Node[V, D],
  container : Interval[V],
  results : Array[IntervalMatch[V, D]],
  interval_type : IntervalType
) -> Unit {
  // 检查当前节点的区间是否被container完全包含
  if interval_contains(container, node.interval, interval_type~) {
    // 创建匹配对象并添加到结果中
    let match_obj = { interval: node.interval, data: node.data }
    results.push(match_obj)
  }

  // 检查左子树 - 不剪枝,遍历所有节点
  match node.left {
    Some(left) => find_contained_helper(left, container, results, interval_type)
    None => ()
  }

  // 检查右子树 - 不剪枝,遍历所有节点
  match node.right {
    Some(right) =>
      find_contained_helper(right, container, results, interval_type)
    None => ()
  }
}

///|
/// 查找与给定区间重叠的所有区间
/// 返回包含匹配区间和数据的数组
pub fn find_overlaps[V : Compare, D](
  self : T[V, D],
  interval : Interval[V]
) -> Array[IntervalMatch[V, D]] {
  let results = []
  match self.root {
    None => results
    Some(root) => {
      find_overlaps_helper(root, interval, results, self.options.interval_type)
      results
    }
  }
}

///|
/// Helper function for find_overlaps
fn find_overlaps_helper[V : Compare, D](
  node : Node[V, D],
  query : Interval[V],
  results : Array[IntervalMatch[V, D]],
  interval_type : IntervalType
) -> Unit {
  // 检查当前节点的区间是否与查询区间重叠
  if intervals_overlap(node.interval, query, interval_type~) {
    // 创建匹配对象并添加到结果中
    let match_obj = { interval: node.interval, data: node.data }
    results.push(match_obj)
  }

  // 如果左子树不为空且可能包含重叠区间,则递归搜索
  match node.left {
    Some(left) =>
      // 如果左子树的最大高端点大于或等于查询的低端点,可能存在重叠
      if endpoints_geq(left.max_high, query.low, interval_type~) {
        find_overlaps_helper(left, query, results, interval_type)
      }
    None => ()
  }

  // 如果右子树不为空且当前节点的低端点小于等于查询的高端点,则递归搜索右子树
  match node.right {
    Some(right) =>
      if endpoints_leq(node.interval.low, query.high, interval_type~) {
        find_overlaps_helper(right, query, results, interval_type)
      }
    None => ()
  }
}

///|
/// Checks if two intervals overlap
///|
/// Checks if two intervals overlap
pub fn intervals_overlap[V : Compare](
  a : Interval[V],
  b : Interval[V],
  interval_type~ : IntervalType = IntervalType::Closed
) -> Bool {
  match interval_type {
    IntervalType::Closed =>
      // [a, b] 与 [c, d] 重叠:b >= c && d >= a
      a.high.compare(b.low) >= 0 && b.high.compare(a.low) >= 0
    IntervalType::Open =>
      // (a, b) 与 (c, d) 重叠:b > c && d > a
      a.high.compare(b.low) > 0 && b.high.compare(a.low) > 0
    IntervalType::LeftClosed =>
      // [a, b) 与 [c, d) 重叠:b > c && d > a
      a.high.compare(b.low) > 0 && b.high.compare(a.low) > 0
    IntervalType::RightClosed =>
      // (a, b] 与 (c, d] 重叠:b >= c && d > a(注意这里 d > a,不是 d >= a)
      a.high.compare(b.low) >= 0 && b.high.compare(a.low) > 0
  }
}

///|
/// Checks if interval a completely contains interval b///|
pub fn interval_contains[V : Compare](
  a : Interval[V],
  b : Interval[V],
  interval_type~ : IntervalType = IntervalType::Closed
) -> Bool {
  match interval_type {
    IntervalType::Closed =>
      // [a, b] 包含 [c, d] 当且仅当 a <= c 且 b >= d
      a.low.compare(b.low) <= 0 && a.high.compare(b.high) >= 0
    IntervalType::Open =>
      // (a, b) 包含 (c, d) 当且仅当 a < c 且 b > d
      a.low.compare(b.low) < 0 && a.high.compare(b.high) > 0
    IntervalType::LeftClosed =>
      // [a, b) 包含 [c, d) 当且仅当 a <= c 且 b >= d,并且如果 b == d,则 d 不能等于 b(因为 b 是开的)
      a.low.compare(b.low) <= 0 &&
      (
        a.high.compare(b.high) > 0 ||
        (a.high.compare(b.high) == 0 && b.high.compare(a.high) != 0)
      )
    IntervalType::RightClosed =>
      // (a, b] 包含 (c, d] 当且仅当 a < c 且 b >= d,并且如果 a == c,则 c 不能等于 a(因为 a 是开的)
      a.low.compare(b.low) < 0 && a.high.compare(b.high) >= 0
  }
}

///|
/// Helper: Checks if a <= b accounting for interval type
pub fn endpoints_leq[V : Compare](
  a : V,
  b : V,
  interval_type~ : IntervalType = IntervalType::Closed
) -> Bool {
  match interval_type {
    IntervalType::Closed => a.compare(b) <= 0
    IntervalType::Open => a.compare(b) < 0
    IntervalType::LeftClosed => a.compare(b) <= 0
    IntervalType::RightClosed => a.compare(b) < 0
  }
}

///|
/// Helper: Checks if a >= b accounting for interval type
pub fn endpoints_geq[V : Compare](
  a : V,
  b : V,
  interval_type~ : IntervalType = IntervalType::Closed
) -> Bool {
  match interval_type {
    IntervalType::Closed => a.compare(b) >= 0
    IntervalType::Open => a.compare(b) > 0
    IntervalType::LeftClosed => a.compare(b) >= 0
    IntervalType::RightClosed => a.compare(b) > 0
  }
}