code: public List<HString> split(@NonNull Predicate<? super Annotation> delimiterPredicate) {
        List<HString> result = new ArrayList<>();
        int start = -1;
        for (int i = 0; i < tokenLength(); i++) {
           if (delimiterPredicate.test(tokenAt(i))) {
              if (start != -1) {
                 result.add(tokenAt(start).union(tokenAt(i - 1)));
              }
              start = -1;
           } else if (start == -1) {
              start = i;
           }
        }
        if (start != -1) {
           result.add(tokenAt(start).union(tokenAt(tokenLength() - 1)));
        }
        return result;
     }
docs: Splits this HString using the given predicate to apply against tokens. An example of where this might be useful is
  when we want to split long phrases on different punctuation, e.g. commas or semicolons.
  
  @param delimiterPredicate the predicate to use to determine if a token is a delimiter or not
  @return the list of split HString