Decode string data with one or more encodings, trying sequentially
    :param data: bytes: encoded string data
    :param encoding_list: list[string] or string: encoding names
    :return: string: decoded string

def unicode_decode(data, encoding_list):
    """
    Decode string data with one or more encodings, trying sequentially
    :param data: bytes: encoded string data
    :param encoding_list: list[string] or string: encoding names
    :return: string: decoded string
    """
    assert encoding_list, 'encodings must not be empty.'

    xs = distinct(encoding_list if isinstance(encoding_list, list) else [encoding_list])
    first_exp = None
    for i, encoding in enumerate(xs):
        try:
            return data.decode(encoding)
        except UnicodeDecodeError as e:
            if i == 0:
                first_exp = e
    raise first_exp