/*
 * Copyright (c) 2002 - 2006 IBM Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 */
package com.ibm.wala.util.collections;

import java.util.Iterator;

/** A 2-level iterator. has not been tested yet! */
public abstract class ComposedIterator<O, I> implements Iterator<I> {

  private final Iterator<O> outer;
  private Iterator<? extends I> inner;

  public ComposedIterator(Iterator<O> outer) {
    this.outer = outer;
    advanceOuter();
  }

  private void advanceOuter() {
    while (outer.hasNext()) {
      inner = makeInner(outer.next());
      if (inner.hasNext()) {
        break;
      }
    }
    if (inner != null && !inner.hasNext()) {
      inner = null;
    }
  }

  public abstract Iterator<? extends I> makeInner(O outer);

  @Override
  public void remove() throws UnsupportedOperationException {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean hasNext() {
    return (inner != null);
  }

  @Override
  public I next() {
    I result = inner.next();
    if (!inner.hasNext()) {
      advanceOuter();
    }
    return result;
  }
}
