/*
 * =====================================
 *  Copyright (c) 2019 NextMove Software
 * =====================================
 */

package com.nmsoftware.praline;

public final class CharIter {

  private String str;
  private int pos = 0;

  public CharIter(String str)
  {
    this.str = str;
  }

  public int pos()
  {
    return pos;
  }

  public  char next()
  {
    return str.charAt(pos++);
  }

  public  char peek() {
    return pos < str.length() ? str.charAt(pos) : '\0';
  }

  public  boolean hasNext()
  {
    return pos < str.length();
  }

  public  String rest() {
    return str.substring(pos);
  }

  static boolean isSpace(char c)
  {
    return c == ' ';
  }

  static boolean isDigit(char c)
  {
    return c >= '0' && c <= '9';
  }

  public  void skipWhiteSpace()
  {
    while (hasNext()) {
      if (isSpace(str.charAt(pos)))
        pos++;
      else
        break;
    }
  }

  public  int nextUnsignedNum()
  {
    if (!hasNext())
      return -1;
    if (!isDigit(peek()))
      return -1;
    int num = next() - '0';
    while (hasNext() && isDigit(peek()))
      num = (10 * num) + (next() - '0');
    return num;
  }

  public boolean consume(String substr)
  {
    if (pos + substr.length() > str.length())
      return false;
    int mark = pos;
    for (int i = 0; i < substr.length(); i++) {
      if (substr.charAt(i) != str.charAt(pos)) {
        pos = mark; // reset
        break;
      }
      pos++;
    }
    return pos - mark == substr.length();
  }

  public String substring(int beg, int end) {
    return str.substring(beg, end);
  }

  @Override
  public String toString()
  {
    StringBuilder sb = new StringBuilder();
    sb.append(str.substring(0, pos));
    sb.append('|');
    sb.append(str.substring(pos, str.length()));
    return sb.toString();
  }

  public void seek(int tmp) {
    this.pos = tmp;
  }

  public boolean nextIf(char c) {
    if (peek() == c) {
      next();
      return true;
    }
    return false;
  }
}
