using System; using System.Collections; using System.Collections.Generic; namespace NadekoBot.Common.Collections { public static class DisposableReadOnlyListExtensions { public static IDisposableReadOnlyList AsDisposable(this IReadOnlyList arr) where T : IDisposable => new DisposableReadOnlyList(arr); public static IDisposableReadOnlyList> AsDisposable(this IReadOnlyList> arr) where TValue : IDisposable => new DisposableReadOnlyList(arr); } public interface IDisposableReadOnlyList : IReadOnlyList, IDisposable { } public class DisposableReadOnlyList : IDisposableReadOnlyList where T : IDisposable { private readonly IReadOnlyList _arr; public int Count => _arr.Count; public T this[int index] => _arr[index]; public DisposableReadOnlyList(IReadOnlyList arr) { this._arr = arr; } public IEnumerator GetEnumerator() => _arr.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _arr.GetEnumerator(); public void Dispose() { foreach (var item in _arr) { item.Dispose(); } } } public class DisposableReadOnlyList : IDisposableReadOnlyList> where U : IDisposable { private readonly IReadOnlyList> _arr; public int Count => _arr.Count; KeyValuePair IReadOnlyList>.this[int index] => _arr[index]; public DisposableReadOnlyList(IReadOnlyList> arr) { this._arr = arr; } public IEnumerator> GetEnumerator() => _arr.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _arr.GetEnumerator(); public void Dispose() { foreach (var item in _arr) { item.Value.Dispose(); } } } }