Code/Stallers/WaitUntil.cs
using System;
using static Sandbox.GameObjectSystem;

namespace Coroutines.Stallers;

/// <summary>
/// Pauses a coroutine until a method returns true.
/// </summary>
public sealed class WaitUntil : ICoroutineStaller
{
	/// <inheritdoc/>
	public bool IsComplete => Waiter();
	/// <inheritdoc/>
	public Stage PollingStage { get; }

	/// <summary>
	/// The method wait for to return true.
	/// </summary>
	private Func<bool> Waiter { get; }

	/// <summary>
	/// Initializes a new instance of <see cref="WaitUntil"/>.
	/// </summary>
	/// <param name="waiter">The method to wait for.</param>
	/// <param name="pollingStage">The way for the coroutine to wait for completion.</param>
	public WaitUntil( Func<bool> waiter, Stage pollingStage = Coroutine.PreservePollingStage )
	{
		Waiter = waiter;
		PollingStage = pollingStage;
	}

	/// <inheritdoc/>
	public void Update()
	{
	}
}