using System.Collections.Generic; using FluentValidation; using MfGames.Gallium; using MfGames.Nitride.Generators; using NodaTime; namespace MfGames.Nitride.Temporal; /// /// Filters out all expired entities that are before the expiration. /// [WithProperties] public partial class FilterOutExpiredInstant : OperationBase { private readonly IValidator validator; public FilterOutExpiredInstant( IValidator validator, Timekeeper clock) { this.validator = validator; this.Timekeeper = clock; } public Timekeeper Timekeeper { get; set; } /// public override IEnumerable Run(IEnumerable input) { this.validator.ValidateAndThrow(this); if (!this.Timekeeper.Expiration.HasValue) { return input; } return input.SelectEntity(this.IsNotExpired); } private Entity? IsNotExpired( Entity entity, Instant instant, CanExpire _) { Instant expiration = this.Timekeeper.Expiration!.Value; bool isExpired = instant.CompareTo(expiration) < 0; return isExpired ? null : entity; } }