code: def parse_modes(params, mode_types=None, prefixes=''):
      
      # we don't accept bare strings because we don't want to try to do
      #   intelligent parameter splitting
      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
docs: 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.