///|
type Range

///|
pub impl Show for Range with output(self : Range, logger : &@builtin.Logger) -> Unit {
  logger.write_object(self.start_point())
  logger.write_string(" - ")
  logger.write_object(self.end_point())
}

///|
extern "js" fn ts_range_new(
  start_point : Point,
  end_point : Point,
  start_byte : UInt,
  end_byte : UInt,
) -> Range =
  #|(start_point, end_point, start_byte, end_byte) => {
  #|  return {
  #|    startPosition: start_point,
  #|    endPosition: end_point,
  #|    startIndex: start_byte,
  #|    endIndex: end_byte,
  #|  }
  #|}

///|
pub fn Range::new(
  start_pointer : Point,
  end_pointer : Point,
  start_byte : Int,
  end_byte : Int,
) -> Range {
  let start_byte = int_to_uint(start_byte)
  let end_byte = int_to_uint(end_byte)
  ts_range_new(start_pointer, end_pointer, start_byte, end_byte)
}

///|
pub extern "js" fn Range::start_point(self : Range) -> Point =
  #|(range) => {
  #|  return range.startPosition;
  #|}

///|
pub extern "js" fn Range::end_point(self : Range) -> Point =
  #|(range) => {
  #|  return range.endPosition;
  #|}

///|
pub extern "js" fn Range::start_byte(self : Range) -> Int =
  #|(range) => {
  #|  return range.startIndex;
  #|}

///|
pub extern "js" fn Range::end_byte(self : Range) -> Int =
  #|(range) => {
  #|  return range.endIndex;
  #|}