SharpGen/Model/CsBaseItemListCache.cs (37 lines of code) (raw):

using System.Collections.Generic; using System.Linq; namespace SharpGen.Model { internal interface IExpiring { void Expire(); } internal struct CsBaseItemListCache<T> where T : CsBase { private ImmutableCacheList list; public IReadOnlyList<T> GetList(CsBase container) { if (list is {Invalid: true}) list = null; return list ??= new ImmutableCacheList(container.Items.OfType<T>()); } public IEnumerable<T> Enumerate(CsBase container) { if (list is {Invalid: true}) list = null; return list ?? container.Items.OfType<T>(); } public IExpiring Expiring => list; private sealed class ImmutableCacheList : List<T>, IExpiring { public bool Invalid; public ImmutableCacheList(IEnumerable<T> collection) : base(collection) { } public void Expire() { Invalid = true; } } } }