
var CountWaiterStatics = {};
CountWaiterStatics.CountWaiterMode = {"Simple":0,"WaitForGo":1};

class CountWaiter
{
	constructor(mode /*CountWaiter.CountWaiterMode*/)
	{
		this.callback = null;
		this.count = 0;
		this.started = false;
		this.mode = CountWaiterStatics.CountWaiterMode.Simple;
		this.param = null;
		
		if (mode !== undefined) this.mode = mode;
	}

	init(callback /*Action<T>*/, mode /*CountWaiter.CountWaiterMode*/, param /*T*/)
	{
		if (mode === undefined) mode = this.mode;
		if (param === undefined) param = null;

		this.mode = mode;
		this.callback = callback;
		this.param = param;
		this.count = 0;
		
		this.started = (mode == CountWaiterStatics.CountWaiterMode.Simple);
	}


	wait()
	{
		this.count++;
	}

	waitMany(num /*int*/)
	{
		this.count += num;
	}

	waitDone()
	{
		this.count--;
		if (this.started)
		{
			this.checkDone();
		}
	}

	checkDone()
	{
		if (this.count == 0)
		{
			var tmp = this.callback;
			var tmpParam = this.param;
			this.callback = null;
			this.param = null;
			if (tmp != null) tmp(tmpParam);
		}
	}

	go()
	{
		this.started = true;
		this.checkDone();
	}

	clear()
	{
		this.started = false;
		this.callback = null;
		this.count = 0;
		this.param = null;
	}

}