code: def calc_update_events(self, asin_to_progress):
          
          new_events = []
          for asin, new_progress in asin_to_progress.iteritems():
              try:
                  book_snapshot = self.get_book(asin)
              except KeyError:
                  new_events.append(AddEvent(asin))
              else:
                  if book_snapshot.status == ReadingStatus.CURRENT:
                      change = new_progress - book_snapshot.progress
                      if change > 0:
                          new_events.append(ReadEvent(asin, change))
          return new_events
docs: Calculate and return an iterable of `KindleEvent`s which, when
          applied to the current snapshot, result in the the current snapshot
          reflecting the progress state of the `asin_to_progress` mapping.
  
          Functionally, this method generates `AddEvent`s and `ReadEvent`s from
          updated Kindle Library state.
  
          Args:
              asin_to_progress: A map of book asins to the integral
                  representation of progress used in the current snapshot.
  
          Returns:
              A list of Event objects that account for the changes detected in
              the `asin_to_progress`.