using MyCollections.Generic; using System; using System.Collections; using UnityEngine; namespace MyCollections.Stats { public class StatsMediator { private readonly LinkedList<StatModifier> modifiers = new LinkedList<StatModifier>(); public event EventHandler<Query> Queries; public void PerformQuery(object sender, Query query) => Queries?.Invoke(sender, query); public void AddModifier(StatModifier modifier) { modifiers.InsertAtBegin(modifier); Queries += modifier.Handle; modifier.OnDispose += callback => { modifiers.Remove(modifier); Queries -= modifier.Handle; }; } public void Update(float deltatime) { ListNode<StatModifier> node = modifiers.Head; while (node != null) { StatModifier modifier = node.Data; modifier.Update(deltatime); node = node.Next; } node = modifiers.Head; while (node != null) { ListNode<StatModifier> nextNode = node.Next; StatModifier modifier = node.Data; if (modifier.MarkedForRemoval) modifier.Dispose(); node = nextNode; } } } }