package utp;

class ActiveUniqueGenerator<T extends Comparable<T>> implements IActiveGenerator<T> {
	private IActiveGenerator<T> m_genA;
	private IActiveGenerator<T> m_genB;
	
	public ActiveUniqueGenerator(IActiveGenerator<T> genA, IActiveGenerator<T> genB) {
		m_genA = genA;
		m_genB = genB;
	}

	private void findFirst() throws StopException
	{
		while(true)
		{
			T a = m_genA.value();
			T b = m_genB.value();
			int i = a.compareTo(b);
			if(i == 0) break;
			if(i < 0) m_genA = m_genA.next();
			else m_genB = m_genB.next();
		}
	}
	
	private void stepNext() throws StopException
	{
		while(true)
		{
			T a = m_genA.value();
			T b = m_genB.value();
			int i = a.compareTo(b);
			if(i != 0) break;
			m_genA = m_genA.next();
		}
	}
	
	@Override
	public T value() throws StopException {
		findFirst();
		return m_genA.value();
	}

	@Override
	public IActiveGenerator<T> next() {
		try {
			findFirst();
			ActiveUniqueGenerator<T> nextGen = new ActiveUniqueGenerator<T>(m_genA, m_genB);
			nextGen.stepNext();
			return nextGen;
		} catch (StopException e) {
			return new ActiveNullGenerator<T>();
		}
		

	}
};
