using XFEEDToolBox.Core.Engineering;
namespace XFEEDToolBox.Core.Planning;
/// <summary>Tracks materials that needed collecting, so later restocking can mark them complete.</summary>
public sealed class MaterialChecklist
{
private readonly HashSet<string> included = new(StringComparer.OrdinalIgnoreCase);
public IReadOnlyList<string> Keys => included.Order(StringComparer.OrdinalIgnoreCase).ToArray();
public void Clear() => included.Clear();
public void Restore(IEnumerable<string> keys)
{
included.Clear();
foreach (var key in keys.Where(key => !string.IsNullOrWhiteSpace(key))) included.Add(key.Trim());
}
public IReadOnlyList<MaterialNeed> Update(IReadOnlyList<MaterialNeed> aggregatedNeeds)
{
var needed = aggregatedNeeds.Where(material => material.Required > 0).ToArray();
included.IntersectWith(needed.Select(material => material.Key));
foreach (var material in needed.Where(material => material.Missing > 0)) included.Add(material.Key);
return needed.Where(material => included.Contains(material.Key)).OrderBy(material => material.Missing == 0).ThenByDescending(material => material.Missing).ToArray();
}
}
using XFEEDToolBox.Core.Engineering;
namespace XFEEDToolBox.Core.Planning;
/// <summary>Tracks materials that needed collecting, so later restocking can mark them complete.</summary>
public sealed class MaterialChecklist
{
private readonly HashSet<string> included = new(StringComparer.OrdinalIgnoreCase);
public IReadOnlyList<string> Keys => included.Order(StringComparer.OrdinalIgnoreCase).ToArray();
public void Clear() => included.Clear();
public void Restore(IEnumerable<string> keys)
{
included.Clear();
foreach (var key in keys.Where(key => !string.IsNullOrWhiteSpace(key))) included.Add(key.Trim());
}
public IReadOnlyList<MaterialNeed> Update(IReadOnlyList<MaterialNeed> aggregatedNeeds)
{
var needed = aggregatedNeeds.Where(material => material.Required > 0).ToArray();
included.IntersectWith(needed.Select(material => material.Key));
foreach (var material in needed.Where(material => material.Missing > 0)) included.Add(material.Key);
return needed.Where(material => included.Contains(material.Key)).OrderBy(material => material.Missing == 0).ThenByDescending(material => material.Missing).ToArray();
}
}