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