def calculate_slasher_snapshot_difference(client, snapshot_old, snapshot_new):
    """
    Calculates the difference between two slasher snapshots
    
    Parameters
    ----------
    client : ``Client``
        The respective client.
    snapshot_old :  `None` or `tuple` of (`dict` of (`int`, `list` of `tuple` \
            (`bool`, ``SlasherApplicationCommand``)) items, `None` or `set` of ``ComponentCommand``)
        An old snapshot taken.
    snapshot_new :  `None` or `tuple` of (`dict` of (`int`, `list` of `tuple` \
            (`bool`, ``SlasherApplicationCommand``)) items, `None` or `set` of ``ComponentCommand``)
        A new snapshot.
    
    Returns
    -------
    snapshot_difference : `None` or `tuple` (`tuple` (`set` of ``SlasherApplicationCommand``, `set` of \
            ``SlasherApplicationCommand``), `tuple` (`None` or `set` of ``ComponentCommand``, `None` or \
            `set` of ``ComponentCommand``)
        The difference between the two snapshots.
    """
    if (snapshot_old is None) and (snapshot_new is None):
        return None
    
    
    if snapshot_old is None:
        application_command_snapshot_old = None
        component_command_snapshot_old = None
    else:
        application_command_snapshot_old, component_command_snapshot_old = snapshot_old
    
    if snapshot_new is None:
        application_command_snapshot_new = None
        component_command_snapshot_new = None
    else:
        application_command_snapshot_new, component_command_snapshot_new = snapshot_new
        
    
    if (application_command_snapshot_old is not None) or (application_command_snapshot_new is not None):
        added_application_commands = []
        removed_application_commands = []
        
        guild_ids = set()
        if (application_command_snapshot_old is not None):
            guild_ids.update(application_command_snapshot_old.keys())
        
        if (application_command_snapshot_new is not None):
            guild_ids.update(application_command_snapshot_new.keys())
        
        for guild_id in guild_ids:
            local_added_application_commands = []
            local_removed_application_commands = []
            
            if (application_command_snapshot_new is not None):
                try:
                    new_changes = application_command_snapshot_new[guild_id]
                except KeyError:
                    pass
                else:
                    for added, command in new_changes:
                        if added:
                            local_added_application_commands.append(command)
                        else:
                            local_removed_application_commands.remove(command)
            
            if (application_command_snapshot_old is not None):
                try:
                    old_changes = application_command_snapshot_old[guild_id]
                except KeyError:
                    pass
                else:
                    for added, command in old_changes:
                        if added:
                            try:
                                local_added_application_commands.remove(command)
                            except ValueError:
                                local_removed_application_commands.append(command)
                        else:
                            try:
                                local_removed_application_commands.remove(command)
                            except ValueError:
                                local_added_application_commands.append(command)
            
            added_application_commands.extend(local_added_application_commands)
            removed_application_commands.extend(local_removed_application_commands)
        
        if (not added_application_commands):
            added_application_commands = None
        
        if (not removed_application_commands):
            removed_application_commands = None
    
        if (added_application_commands is None) and (removed_application_commands is None):
            application_command_difference = None
        else:
            if client.running and client.application.id:
                slasher = getattr(client, 'slasher', None)
                if (slasher is not None):
                    slasher.sync()
            
            application_command_difference = added_application_commands, removed_application_commands
    else:
        application_command_difference = None
    
    if (component_command_snapshot_old is None) or (component_command_snapshot_new is None):
        removed_component_commands = component_command_snapshot_old
        added_component_commands = component_command_snapshot_new
    else:
        removed_component_commands = component_command_snapshot_old-component_command_snapshot_new
        added_component_commands = component_command_snapshot_new-component_command_snapshot_old
        
        if (not removed_component_commands):
            removed_component_commands = None
        
        if (not added_component_commands):
            added_component_commands = None
    
    if (added_component_commands is None) and (removed_component_commands is None):
        component_command_difference = None
    else:
        component_command_difference = (removed_component_commands, added_component_commands)
    
    if (application_command_difference is None) and (component_command_difference is None):
        snapshot_difference = None
    else:
        snapshot_difference = (application_command_difference, component_command_difference)
    
    return snapshot_difference