class Line: def __init__(self, byte_offset: int, byte_end: int, line: str): self._byte_offset = byte_offset self._byte_end = byte_end self._line = line def byte_offset(self): return self._byte_offset def byte_end(self): return self._byte_end def line(self): return self._line def length(self): return len(self._line) def includes_byte(self, byte: int) -> bool: return self._byte_offset <= byte <= self._byte_end def intersects(self, start_byte: int, end_byte: int): result = start_byte < self._byte_end and end_byte > self._byte_offset #print("%d,%d in %d,%d" % (start_byte, end_byte, self._byte_offset, self._byte_end)) return result def prefix(self, index: int) -> str: return self._line[0:index] def substr(self, offset: int, length: int) -> str: return self._line[offset:offset+length] def suffix(self, index: int) -> str: return self._line[index:] def __str__(self): return "%s (%d->%d)" % (self._line, self._byte_offset, self._byte_end)