using System.Collections.Generic; using System.Threading; 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, TimeService clock) { this.validator = validator; this.TimeService = clock; } public TimeService TimeService { get; set; } /// public override IEnumerable Run( IEnumerable input, CancellationToken cancellationToken = default) { this.validator.ValidateAndThrow(this); if (!this.TimeService.Expiration.HasValue) { return input; } return input.SelectEntity(this.IsNotExpired); } private Entity? IsNotExpired( Entity entity, Instant instant, CanExpire _) { Instant expiration = this.TimeService.Expiration!.Value; bool isExpired = instant.CompareTo(expiration) < 0; return isExpired ? null : entity; } }