|
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using Svelto.Tasks;
- using Svelto.Tasks.Enumerators;
-
- namespace GamecraftModdingAPI.Tasks
- {
- /// <summary>
- /// An asynchronous repeating task.
- /// Once constructed, this can be run by scheduling it with Scheduler.Schedule()
- /// </summary>
- public class Repeatable : ISchedulable
- {
- /// <summary>
- /// Determines if the task should continue to repeat
- /// </summary>
- /// <returns>Whether the task should run again (true) or end (false)</returns>
- public delegate bool ShouldContinue();
-
- private ShouldContinue shouldContinue;
-
- private Action task;
-
- private float delay;
-
- public IEnumerator<TaskContract> Run()
- {
- while (shouldContinue())
- {
- task();
- yield return new WaitForSecondsEnumerator(delay).Continue();
- }
- yield return Yield.It;
- }
-
- /// <summary>
- /// Construct a repeating task
- /// </summary>
- /// <param name="task">The task to repeat</param>
- /// <param name="shouldContinue">The check to determine if the task should run again</param>
- /// <param name="delay">The time to wait between repeats (in seconds)</param>
- public Repeatable(Action task, ShouldContinue shouldContinue, float delay = 0.0f)
- {
- this.task = task;
- this.shouldContinue = shouldContinue;
- this.delay = delay;
- }
-
- /// <summary>
- /// Construct a repeating task
- /// </summary>
- /// <param name="task">The task to repeat</param>
- /// <param name="count">The amount of times to repeat</param>
- /// <param name="delay">The time to wait between repeats (in seconds)</param>
- public Repeatable(Action task, int count, float delay = 0.0f)
- {
- this.task = task;
- this.shouldContinue = () => { return count-- != 0; };
- this.delay = delay;
- }
- }
- }
|