NamedCodePointRanges.java

/*
 * Copyright (C) 2021 Google, LLC.
 * SPDX-License-Identifier: BSD-3-Clause
 */

package de.jflex.ucd;

import com.google.common.collect.ImmutableList;
import java.util.Comparator;
import java.util.List;

public class NamedCodePointRanges {

  public static ImmutableList<NamedCodepointRange<String>> merge(
      List<NamedCodepointRange<String>> ranges) {
    ranges = sort(ranges);
    ImmutableList.Builder<NamedCodepointRange<String>> retval = ImmutableList.builder();
    NamedCodepointRange<String> prev = ranges.get(0);
    for (int i = 1; i < ranges.size(); i++) {
      NamedCodepointRange<String> block = ranges.get(i);
      if (prev.name().equals(block.name())
          && prev.range().end() + 1 == ranges.get(i).range().start()) {
        // merge the two blocks
        prev = NamedCodepointRange.create(block.name(), prev.range().start(), block.range().end());
      } else {
        retval.add(prev);
        prev = block;
      }
    }
    // add last
    retval.add(prev);
    return retval.build();
  }

  public static ImmutableList<NamedCodepointRange<String>> sort(
      List<NamedCodepointRange<String>> ranges) {
    Comparator<NamedCodepointRange<String>> comparator =
        (o1, o2) -> CodepointRange.COMPARATOR.compare(o1.range(), o2.range());
    return ImmutableList.sortedCopyOf(comparator, ranges);
  }

  private NamedCodePointRanges() {}
}