using System.Collections;

namespace InnovEnergy.Lib.Units;

public readonly struct State<T> : IReadOnlyList<T> where T:Enum
{
    public IReadOnlyList<T> Values { get; }
    
    public State(IReadOnlyList<T> values) => Values = values;

    public State(params T[] values) : this((IReadOnlyList<T>)values){}
    public State(params State<T>[] states) : this((IReadOnlyList<T>)states.SelectMany(s => s.Values).ToList()){}

    public static implicit operator State<T>(T s)       => new((IReadOnlyList<T>)s);
    public static implicit operator State<T>(List<T> s) => new((IReadOnlyList<T>)s);
    public static implicit operator State<T>(T[] s)     => new((IReadOnlyList<T>)s);
    
    public static State<T> operator |(State<T> left, State<T> right) => new State<T>(left, right);

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

    public override String ToString() => String.Join("; ", Values);
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    public Int32 Count => Values.Count;
    public T this[Int32 index] => Values[index];
}