<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def calc_update_events(self, asin_to_progress):
 """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`. """

        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