using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace Syntriax.Engine.Core; public static class UniverseObjectExtensions { public static T SetUniverseObject(this T universeObject, string? name = "", IUniverseObject? parent = null) where T : IUniverseObject { if (!string.IsNullOrWhiteSpace(name)) universeObject.Name = name; if (parent is not null) universeObject.SetParent(parent); return universeObject; } #region Universe Object Search public static T? GetUniverseObject(this IEnumerable universeObjects) where T : class { foreach (IUniverseObject universeObject in universeObjects) if (universeObject is T @object) return @object; return default; } public static bool TryGetUniverseObject(this IEnumerable universeObjects, [NotNullWhen(returnValue: true)] out T? universeObject) where T : class { universeObject = GetUniverseObject(universeObjects); return universeObject is not null; } public static void GetUniverseObjects(this IEnumerable universeObjects, IList foundUniverseObjects) where T : class { foundUniverseObjects.Clear(); foreach (IUniverseObject universeObject in universeObjects) if (universeObject is T @object) foundUniverseObjects.Add(@object); } #endregion #region Behaviour Search public static T? FindBehaviour(this IEnumerable universeObjects) where T : class { foreach (IUniverseObject universeObject in universeObjects) if (universeObject.BehaviourController.GetBehaviour() is T behaviour) return behaviour; return default; } public static bool TryFindBehaviour(this IEnumerable universeObjects, [NotNullWhen(returnValue: true)] out T? behaviour) where T : class { behaviour = FindBehaviour(universeObjects); return behaviour is not null; } public static void FindBehaviours(this IEnumerable universeObjects, IList behaviours) where T : class { behaviours.Clear(); List cache = []; foreach (IUniverseObject universeObject in universeObjects) { universeObject.BehaviourController.GetBehaviours(cache); foreach (T behaviour in cache) behaviours.Add(behaviour); } } #endregion }