code: public Mutations<S> removeMutationsInRange(int from, int to) {
          if (to < from)
              throw new IllegalArgumentException("Reversed ranges are not supported.");
  
          // If range is empty return untouched mutations object
          if (from == to)
              return this;
  
          // Determine range in mutations to remove
          long indexRange = getIndexRange(from, to);
  
          // Unpacking
          int fromIndex = (int) (indexRange >>> 32),
                  toIndex = (int) (indexRange & 0xFFFFFFFF);
  
          if (fromIndex == 0 && toIndex == mutations.length)
              return empty(alphabet);
  
          // Creating result
          int[] result = new int[mutations.length - (toIndex - fromIndex)];
  
          // Constant to move positions in the output array
          int offset = (from - to) << POSITION_OFFSET; // Negative value
  
          // Copy and move mutations
          int i = 0;
          for (int j = 0; j < fromIndex; ++j)
              result[i++] = mutations[j];
          for (int j = toIndex; j < mutations.length; ++j)
              result[i++] = mutations[j] + offset;
  
          assert i == result.length;
  
          return new Mutations<>(alphabet, result, true);
      }
docs: Removes mutations for a range of positions in the original sequence and performs shift of corresponding
  positions of mutations.
  
  <p>Insertions before {@code from} will be left untouched. Insertions after {@code (to - 1)} will be removed.</p>
  
  <p>
  <b>Important:</b> to remove leftmost insertions (left trailing insertions) use {@code from = -1}. E.g.
  {@code extractRelativeMutationsForRange(mut, -1, seqLength) == mut}.
  </p>
  
  @param from left bound of range, inclusive. Use -1 to extract leftmost insertions.
  @param to   right bound of range, exclusive
  @return mutations for a range of positions