def parse_modes(params, mode_types=None, prefixes=''):
    """Return a modelist.

    Args:
        params (list of str): Parameters from MODE event.
        mode_types (list): CHANMODES-like mode types.
        prefixes (str): PREFIX-like mode types.
    """
    params = list(params)
    if params[0][0] not in '+-':
        raise Exception('first param must start with + or -')
    if mode_types is None:
        mode_types = ['', '', '', '']
    mode_string = params.pop(0)
    args = params
    assembled_modes = []
    direction = mode_string[0]
    for char in mode_string:
        if char in '+-':
            direction = char
            continue
        if char in mode_types[0] or char in mode_types[1
            ] or char in prefixes or (char in mode_types[2] and direction ==
            '+') and len(args):
            value = args.pop(0)
        else:
            value = None
        assembled_modes.append([direction, char, value])
    return assembled_modes
