using System;
using System.Collections;
using System.Collections.Generic;
using Godot;

public partial class Coroutine
{
	public IEnumerator enumerator;

	public bool done;

	private bool hasCaller;

	public Node caller;

	public Action onEnd;

	private static List<Coroutine> coroutines = new List<Coroutine>();

	private static List<Coroutine> stop = new List<Coroutine>();

	public static Coroutine Start(IEnumerator enumerator, Node caller = null)
	{
		Coroutine coroutine = new Coroutine
		{
			enumerator = enumerator,
			caller = caller,
			hasCaller = (caller != null)
		};
		coroutines.Add(coroutine);
		return coroutine;
	}

	public static void Stop(Coroutine routine, bool now = false)
	{
		if (routine != null)
		{
			if (now)
			{
				coroutines.Remove(routine);
			}
			else
			{
				stop.Add(routine);
			}
		}
	}

	public static void DoLoop()
	{
		if (stop.Count > 0)
		{
			for (int num = stop.Count - 1; num >= 0; num--)
			{
				stop[num].done = true;
				coroutines.Remove(stop[num]);
				stop.RemoveAt(num);
			}
		}
		if (coroutines.Count == 0)
		{
			return;
		}
		for (int num2 = coroutines.Count - 1; num2 >= 0; num2--)
		{
			if ((coroutines[num2].hasCaller && !GodotObject.IsInstanceValid(coroutines[num2].caller)) || !coroutines[num2].enumerator.MoveNext())
			{
				Finish(num2);
			}
		}
	}

	private static void Finish(int id)
	{
		coroutines[id].done = true;
		coroutines[id].onEnd?.Invoke();
		coroutines.RemoveAt(id);
	}
}