a method to generate the differences between two data architectures
        
    :param new_record: set, list or dictionary with new details of an item
    :param old_record: set, list or dictionary with old details of an item
    :return: list with dictionary of changes between old and new records
    
    [ { 
        'path': [ 'dict2', 'dict', 'list2', 4, 'key' ],
        'action': 'UPDATE',
        'value': 'newValue'
    } ]

def compare_records(new_record, old_record):

    '''
        a method to generate the differences between two data architectures
        
    :param new_record: set, list or dictionary with new details of an item
    :param old_record: set, list or dictionary with old details of an item
    :return: list with dictionary of changes between old and new records
    
    [ { 
        'path': [ 'dict2', 'dict', 'list2', 4, 'key' ],
        'action': 'UPDATE',
        'value': 'newValue'
    } ]
    '''

    if new_record.__class__ != old_record.__class__:
        raise TypeError('Datatype of new and old data must match.')
    from copy import deepcopy
    new_map = deepcopy(new_record)
    old_map = deepcopy(old_record)
    if isinstance(new_map, dict):
        return _compare_dict(new_map, old_map, [], [])
    elif isinstance(new_map, list):
        return _compare_list(new_map, old_map, [], [])
    elif isinstance(new_map, set):
        return _compare_set(new_map, old_map, [], [])
    else:
        raise TypeError('Records must be either sets, lists or dictionaries.')