Provides information about each changeset present in an OpenStreetMap diff
    file.

    Parameters
    ----------
    objects : osc_decoder class
        A class containing OpenStreetMap object dictionaries.

    Returns
    -------
    changeset_collation : dict
        A dictionary of dictionaries with each changeset as a separate key,
        information about each changeset as attributes in that dictionary,
        and the actions performed in the changeset as keys.

def extract_changesets(objects):
    """
    Provides information about each changeset present in an OpenStreetMap diff
    file.

    Parameters
    ----------
    objects : osc_decoder class
        A class containing OpenStreetMap object dictionaries.

    Returns
    -------
    changeset_collation : dict
        A dictionary of dictionaries with each changeset as a separate key,
        information about each changeset as attributes in that dictionary,
        and the actions performed in the changeset as keys.
    """
    def add_changeset_info(collation, axis, item):
        """
        """
        if axis not in collation:
            collation[axis] = {}

        first = collation[axis]

        first["id"] = axis
        first["username"] = item["username"]
        first["uid"] = item["uid"]
        first["timestamp"] = item["timestamp"]

        collation[axis] = first

    changeset_collation = {}

    for node in objects.nodes.values():
        _collate_data(changeset_collation, node['changeset'], node['action'])
        add_changeset_info(changeset_collation, node['changeset'], node)
    for way in objects.ways.values():
        _collate_data(changeset_collation, way['changeset'], way['action'])
        add_changeset_info(changeset_collation, way['changeset'], way)
    for relation in objects.relations.values():
        _collate_data(changeset_collation, relation['changeset'], relation['action'])
        add_changeset_info(changeset_collation, relation['changeset'], relation)

    return changeset_collation