| 218 | ## cached metadata to speed up screen refreshes |
| 219 | @dataclass |
| 220 | class RefreshCache: |
| 221 | screen: list[str] = field(default_factory=list) |
| 222 | screeninfo: list[tuple[int, list[int]]] = field(init=False) |
| 223 | line_end_offsets: list[int] = field(default_factory=list) |
| 224 | pos: int = field(init=False) |
| 225 | cxy: tuple[int, int] = field(init=False) |
| 226 | dimensions: tuple[int, int] = field(init=False) |
| 227 | invalidated: bool = False |
| 228 | |
| 229 | def update_cache(self, |
| 230 | reader: Reader, |
| 231 | screen: list[str], |
| 232 | screeninfo: list[tuple[int, list[int]]], |
| 233 | ) -> None: |
| 234 | self.screen = screen.copy() |
| 235 | self.screeninfo = screeninfo.copy() |
| 236 | self.pos = reader.pos |
| 237 | self.cxy = reader.cxy |
| 238 | self.dimensions = reader.console.width, reader.console.height |
| 239 | self.invalidated = False |
| 240 | |
| 241 | def valid(self, reader: Reader) -> bool: |
| 242 | if self.invalidated: |
| 243 | return False |
| 244 | dimensions = reader.console.width, reader.console.height |
| 245 | dimensions_changed = dimensions != self.dimensions |
| 246 | return not dimensions_changed |
| 247 | |
| 248 | def get_cached_location(self, reader: Reader) -> tuple[int, int]: |
| 249 | if self.invalidated: |
| 250 | raise ValueError("Cache is invalidated") |
| 251 | offset = 0 |
| 252 | earliest_common_pos = min(reader.pos, self.pos) |
| 253 | num_common_lines = len(self.line_end_offsets) |
| 254 | while num_common_lines > 0: |
| 255 | offset = self.line_end_offsets[num_common_lines - 1] |
| 256 | if earliest_common_pos > offset: |
| 257 | break |
| 258 | num_common_lines -= 1 |
| 259 | else: |
| 260 | offset = 0 |
| 261 | return offset, num_common_lines |
| 262 | |
| 263 | last_refresh_cache: RefreshCache = field(default_factory=RefreshCache) |
| 264 |
nothing calls this directly
no test coverage detected
searching dependent graphs…