docs: def apply_change(self, change):
          """Apply a change to the document."""
          text = change['text']
          change_range = change.get('range')
  
          if not change_range:
              # The whole file has changed
              self._source = text
              return
  
          start_line = change_range['start']['line']
          start_col = change_range['start']['character']
          end_line = change_range['end']['line']
          end_col = change_range['end']['character']
  
          # Check for an edit occuring at the very end of the file
          if start_line == len(self.lines):
              self._source = self.source + text
              return
  
          new = io.StringIO()
  
          # Iterate over the existing document until we hit the edit range,
          # at which point we write the new text, then loop until we hit
          # the end of the range and continue writing.
          for i, line in enumerate(self.lines):
              if i < start_line:
                  new.write(line)
                  continue
  
              if i > end_line:
                  new.write(line)
                  continue
  
              if i == start_line:
                  new.write(line[:start_col])
                  new.write(text)
  
              if i == end_line:
                  new.write(line[end_col:])
  
          self._source = new.getvalue()