001    package calhoun.util;
002    
003    import java.util.Iterator;
004    
005    public abstract class FilterIterator<A> implements Iterator<A> {
006            Iterator<A> baseIterator;
007            A current = null;
008            
009            
010            public FilterIterator(Iterator<A> base) {
011                    baseIterator = base;
012                    advance();
013            }
014            
015            void advance() {
016                    boolean valid = false;
017                    while(baseIterator.hasNext()) {
018                            current = baseIterator.next();
019                            if(test(current)) {
020                                    valid = true;
021                                    break;
022                            }
023                    }
024                    if(!valid)
025                            current = null;
026            }
027            
028            public boolean hasNext() {
029                    return current != null;
030            }
031            
032            public A next() {
033                    A ret = current;
034                    advance();
035                    return ret;
036            }
037    
038            public void remove() {
039                    throw new UnsupportedOperationException();
040            }
041            
042            public abstract boolean test(A val);
043    }