code: def collapse_substrings(variant_sequences):
      
      if len(variant_sequences) <= 1:
          # if we don't have at least two VariantSequences then just
          # return your input
          return variant_sequences
  
      # dictionary mapping VariantSequence objects to lists of reads
      # they absorb from substring VariantSequences
      extra_reads_from_substrings = defaultdict(set)
      result_list = []
      # sort by longest to shortest total length
      for short_variant_sequence in sorted(
              variant_sequences,
              key=lambda seq: -len(seq)):
          found_superstring = False
          for long_variant_sequence in result_list:
              found_superstring = long_variant_sequence.contains(short_variant_sequence)
              if found_superstring:
                  extra_reads_from_substrings[long_variant_sequence].update(
                      short_variant_sequence.reads)
          if not found_superstring:
              result_list.append(short_variant_sequence)
      # add to each VariantSequence the reads it absorbed from dropped substrings
      # and then return
      return [
          variant_sequence.add_reads(
              extra_reads_from_substrings[variant_sequence])
          for variant_sequence in result_list
      ]
docs: Combine shorter sequences which are fully contained in longer sequences.
  
      Parameters
      ----------
      variant_sequences : list
         List of VariantSequence objects
  
      Returns a (potentially shorter) list without any contained subsequences.