using System.Collections;
using System.Collections.Generic;

namespace Dashboard
{
    public class HashList<T> : IReadOnlyList<T>
        where T : notnull
    {
        private readonly List<T> _list = new List<T>();
        private readonly Dictionary<T, int> _map = new Dictionary<T, int>();

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

        public int Count => _list.Count;

        public int Intern(T value)
        {
            if (_map.TryGetValue(value, out int index))
                return index;

            index = Count;

            _list.Add(value);
            _map.Add(value, index);

            return index;
        }

        public void Clear()
        {
            _list.Clear();
            _map.Clear();
        }

        public IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
        IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
    }
}