import java.util.ArrayList;
import java.util.List;

public class Stream {
    private List<Integer> _data = new ArrayList<Integer>();
    private int _readIndex = -1;
    private boolean _writeMode = false;
    
    public Stream() {
    }

    public Stream(int... saetze) {
        for(int satz : saetze) {
            _data.add(satz);
        }
    }
    
    public void reset() {
        _readIndex = 0;
        _writeMode = false;
    }

    public void rewrite() {
        _writeMode = true;
        _readIndex = -1;
        _data.clear();
    }

    public boolean eof() {
        ensureReadMode();
        return _readIndex >= _data.size(); 
    }

    public int read() {
        Integer result = _data.get(_readIndex);
        _readIndex++;
        return result;
    }

    public void write(int satz) {
        ensureWriteMode();
        _data.add(satz);
    }
    
    //-------------------- Helpers
    
    private void ensureReadMode() {
        if (_readIndex < 0) {
            throw new IllegalStateException("Stream nicht im Lesemodus!");
        }
    }
    private void ensureWriteMode() {
        if (! _writeMode) {
            throw new IllegalStateException("Stream nicht im Schreibmodus!");
        }
    }
    public String toString(int runLength) {
        StringBuilder sb = new StringBuilder();
        sb.append("Stream[");
        for(int i=0; i<_data.size();) {
            sb.append(_data.get(i));
            i++;
            if ((i % runLength) == 0) {
                // Run-Marke auch am Ende der Daten
                sb.append(" | ");
            } else if (i < _data.size()) {
                // Kein Komma am Ende
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
    @Override
    public String toString() {
        return "Stream|"+_readIndex+_data.toString();
    }
}

