package org.unicode.cldr.draft;

import com.ibm.icu.text.StringTransform;

/**
 * Immutable filtered transform
 * @author markdavis
 *
 */
public abstract class FilteredTransform implements StringTransform {
  private final StringTransform transform;

  protected FilteredTransform(StringTransform result) {
    transform = result;
  }

  public String transform(String source) {
    int last = 0;
    // TODO optimize later
    StringBuilder result = new StringBuilder();
    int[] startEnd = new int[2];
    while (getNextRegion(source, startEnd)) {
      if (startEnd[0] > last) {
        result.append(source.substring(last, startEnd[0]));
      }
      result.append(transform.transform(source.substring(startEnd[0], startEnd[1])));
      last = startEnd[1];
    }
    if (last < source.length()) {
      result.append(source.substring(last));
    }
    return result.toString();
  }
  
  abstract protected boolean getNextRegion(String text, int[] startEnd);
  
  /**
   * Subclasses will modify
   */
  public String toString() {
    return transform.toString();
  }
}
