/FileExtraction/Java_unseen/Wind-Development_WindSpigot/WindSpigot-Server/src/main/java/org/bukkit/craftbukkit/util/Waitable.java
package org.bukkit.craftbukkit.util;

import java.util.concurrent.ExecutionException;

public abstract class Waitable<T> implements Runnable {
	private enum Status {
		WAITING, RUNNING, FINISHED,
	}

	Throwable t = null;
	T value = null;
	Status status = Status.WAITING;

	@Override
	public final void run() {
		synchronized (this) {
			if (status != Status.WAITING) {
				throw new IllegalStateException("Invalid state " + status);
			}
			status = Status.RUNNING;
		}
		try {
			value = evaluate();
		} catch (Throwable t) {
			this.t = t;
		} finally {
			synchronized (this) {
				status = Status.FINISHED;
				this.notifyAll();
			}
		}
	}

	protected abstract T evaluate();

	public synchronized T get() throws InterruptedException, ExecutionException {
		while (status != Status.FINISHED) {
			this.wait();
		}
		if (t != null) {
			throw new ExecutionException(t);
		}
		return value;
	}
}
