code: def grouped_parallel_split_combine(args, split_fn, group_fn, parallel_fn,
                                     parallel_name, combine_name,
                                     file_key, combine_arg_keys,
                                     split_outfile_i=-1):
      
      grouped_args = group_fn(args)
      split_args, combine_map, finished_out, extras = _get_split_tasks(grouped_args, split_fn, file_key,
                                                                       split_outfile_i)
      final_output = parallel_fn(parallel_name, split_args)
      combine_args, final_args = _organize_output(final_output, combine_map,
                                                  file_key, combine_arg_keys)
      parallel_fn(combine_name, combine_args)
      return finished_out + final_args + extras
docs: Parallel split runner that allows grouping of samples during processing.
  
      This builds on parallel_split_combine to provide the additional ability to
      group samples and subsequently split them back apart. This allows analysis
      of related samples together. In addition to the arguments documented in
      parallel_split_combine, this needs:
  
      group_fn: A function that groups samples together given their configuration
        details.