using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Net3_Proxy
{

    public class IReadOnlyList<T> : IEnumerable<T>
    {
        private readonly IList<T> list;

        private IReadOnlyList(IList<T> lst)
            => list = lst;

        public IEnumerator<T> GetEnumerator() => list.GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)list).GetEnumerator();

        public int Count => list.Count;

        public T this[int index] => list[index];

        public static implicit operator IReadOnlyList<T>(List<T> list) => new IReadOnlyList<T>(list);
    }

    public class IReadOnlyDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
    {
        private readonly IDictionary<TKey, TValue> dict;

        private IReadOnlyDictionary(IDictionary<TKey, TValue> d)
            => dict = d;

        public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
            => dict.GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator()
            => dict.GetEnumerator();

        public int Count => dict.Count;

        public bool ContainsKey(TKey key) => dict.ContainsKey(key);

        public bool TryGetValue(TKey key, out TValue val)
            => dict.TryGetValue(key, out val);

        public TValue this[TKey key] => dict[key];

        public static implicit operator IReadOnlyDictionary<TKey, TValue>(Dictionary<TKey, TValue> dict)
            => new IReadOnlyDictionary<TKey, TValue>(dict);
    }
}
