qstbak/Questionable/Questionable.Controller.Steps/TaskQueue.cs
2025-10-09 07:47:19 +10:00

78 lines
1.6 KiB
C#

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace Questionable.Controller.Steps;
internal sealed class TaskQueue
{
private readonly List<ITask> _completedTasks = new List<ITask>();
private readonly List<ITask> _tasks = new List<ITask>();
public ITaskExecutor? CurrentTaskExecutor { get; set; }
public IEnumerable<ITask> RemainingTasks => _tasks;
public bool AllTasksComplete
{
get
{
if (CurrentTaskExecutor == null)
{
return _tasks.Count == 0;
}
return false;
}
}
public void Enqueue(ITask task)
{
_tasks.Add(task);
}
public void EnqueueAll(IEnumerable<ITask> tasks)
{
_tasks.InsertRange(0, tasks);
}
public bool TryDequeue([NotNullWhen(true)] out ITask? task)
{
task = _tasks.FirstOrDefault();
if (task == null)
{
return false;
}
if (task.ShouldRedoOnInterrupt())
{
_completedTasks.Add(task);
}
_tasks.RemoveAt(0);
return true;
}
public bool TryPeek([NotNullWhen(true)] out ITask? task)
{
task = _tasks.FirstOrDefault();
return task != null;
}
public void Reset()
{
_tasks.Clear();
_completedTasks.Clear();
CurrentTaskExecutor = null;
}
public void InterruptWith(List<ITask> interruptionTasks)
{
List<ITask> list = new List<ITask>();
list.AddRange(interruptionTasks);
list.AddRange(_completedTasks.Where((ITask x) => x != CurrentTaskExecutor?.CurrentTask).ToList());
list.Add(CurrentTaskExecutor?.CurrentTask);
list.AddRange(_tasks);
List<ITask> source = list;
Reset();
_tasks.AddRange(source.Where((ITask x) => x != null).Cast<ITask>());
}
}