SplitOnSubstring.java

  1. package no.motif.iter;

  2. import static no.motif.Base.equalOrGreaterThan;
  3. import static no.motif.Singular.none;
  4. import static no.motif.Singular.optional;

  5. import java.io.Serializable;
  6. import java.util.Iterator;

  7. import no.motif.single.Optional;

  8. public class SplitOnSubstring implements Iterable<String>, Serializable {

  9.     private final String string;
  10.     private final int stringLength;

  11.     private final String substring;
  12.     private final int substringLength;

  13.     public SplitOnSubstring(String string, String splittingSubstring) {
  14.         this.string = string;
  15.         this.stringLength = string.length();
  16.         this.substring = splittingSubstring;
  17.         this.substringLength = splittingSubstring.length();
  18.     }


  19.     @Override
  20.     public Iterator<String> iterator() {
  21.         return new SimpleIterator<String>() {
  22.             int pos = 0;
  23.             @Override
  24.             protected Optional<? extends String> nextIfAvailable() {
  25.                 if (pos > stringLength) return none();
  26.                 int endIndex = optional(equalOrGreaterThan(0), string.indexOf(substring, pos)).orElse(stringLength);
  27.                 String next = string.substring(pos, endIndex);
  28.                 pos = endIndex + substringLength;
  29.                 return optional(next);
  30.             }
  31.         };
  32.     }
  33. }