using System; using System.Collections.Generic; namespace MfGames.Gallium { public static class SelectEntityExtensions { /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// If true, then entities without all the components are included. Otherwise, they /// are excluded. /// /// The type of the first component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, bool includeEntitiesWithoutComponents = true) { return entities.SelectEntity(selectWithComponents, includeEntitiesWithoutComponents ? a => a : a => null); } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// If true, then entities without all the components are included. Otherwise, they /// are excluded. /// /// The type of the first component. /// The type of the second component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, bool includeEntitiesWithoutComponents = true) { return entities.SelectEntity(selectWithComponents, includeEntitiesWithoutComponents ? a => a : a => null); } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// If true, then entities without all the components are included. Otherwise, they /// are excluded. /// /// The type of the first component. /// The type of the second component. /// The type of the third component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, bool includeEntitiesWithoutComponents = true) { return entities.SelectEntity(selectWithComponents, includeEntitiesWithoutComponents ? a => a : a => null); } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// If true, then entities without all the components are included. Otherwise, they /// are excluded. /// /// The type of the first component. /// The type of the second component. /// The type of the third component. /// The type of the fourth component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, bool includeEntitiesWithoutComponents = true) { return entities.SelectEntity(selectWithComponents, includeEntitiesWithoutComponents ? a => a : a => null); } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// The optional transformation function for entities that do not have all the /// components. If returns null, /// then the entity will not be included. /// /// The type of the first component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, Func selectWithoutComponents) { foreach (Entity entity in entities) { Entity? result = entity.TryGet(out T1 value1) ? selectWithComponents?.Invoke(entity, value1) : selectWithoutComponents?.Invoke(entity); if (result != null) { yield return result; } } } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// The optional transformation function for entities that do not have all the /// components. If returns null, /// then the entity will not be included. /// /// The type of the first component. /// The type of the second component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, Func selectWithoutComponents) { foreach (Entity entity in entities) { Entity? result = entity.TryGet(out T1 value1) && entity.TryGet(out T2 value2) ? selectWithComponents?.Invoke(entity, value1, value2) : selectWithoutComponents?.Invoke(entity); if (result != null) { yield return result; } } } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// The optional transformation function for entities that do not have all the /// components. If returns null, /// then the entity will not be included. /// /// The type of the first component. /// The type of the second component. /// The type of the third component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, Func selectWithoutComponents) { foreach (Entity entity in entities) { Entity? result = entity.TryGet(out T1 value1) && entity.TryGet(out T2 value2) && entity.TryGet(out T3 value3) ? selectWithComponents?.Invoke(entity, value1, value2, value3) : selectWithoutComponents?.Invoke(entity); if (result != null) { yield return result; } } } /// /// Selects an entity from the given list, filtering on entities with /// the given components. /// /// The entities to parse. /// /// The transformation function for the entity and selected components. If this /// returns null, then the entity /// will be filtered out. /// /// /// The optional transformation function for entities that do not have all the /// components. If returns null, /// then the entity will not be included. /// /// The type of the first component. /// The type of the second component. /// The type of the third component. /// The type of the third component. /// An enumeration of transformed entities. public static IEnumerable SelectEntity( this IEnumerable entities, Func selectWithComponents, Func selectWithoutComponents) { foreach (Entity entity in entities) { Entity? result = entity.TryGet(out T1 value1) && entity.TryGet(out T2 value2) && entity.TryGet(out T3 value3) && entity.TryGet(out T4 value4) ? selectWithComponents?.Invoke(entity, value1, value2, value3, value4) : selectWithoutComponents?.Invoke(entity); if (result != null) { yield return result; } } } } }