code: def _analyze(self):
          
          if self.value is None or self.value == self.previous:
              pass
  
          elif self._operation == "append":
              self._append = self.value
  
          elif self._operation == "prepend":
              self._prepend = self.value
  
          elif self.previous is None:
              self._assignments = self.value
  
          elif len(self.value) < len(self.previous):
              # if elements have been removed,
              # rewrite the whole list
              self._assignments = self.value
  
          elif len(self.previous) == 0:
              # if we're updating from an empty
              # list, do a complete insert
              self._assignments = self.value
          else:
  
              # the max start idx we want to compare
              search_space = len(self.value) - max(0, len(self.previous) - 1)
  
              # the size of the sub lists we want to look at
              search_size = len(self.previous)
  
              for i in range(search_space):
                  # slice boundary
                  j = i + search_size
                  sub = self.value[i:j]
                  idx_cmp = lambda idx: self.previous[idx] == sub[idx]
                  if idx_cmp(0) and idx_cmp(-1) and self.previous == sub:
                      self._prepend = self.value[:i] or None
                      self._append = self.value[j:] or None
                      break
  
              # if both append and prepend are still None after looking
              # at both lists, an insert statement will be created
              if self._prepend is self._append is None:
                  self._assignments = self.value
  
          self._analyzed = True
docs: works out the updates to be performed