using System.Collections.Generic;

namespace Utility
{
	/// <summary>
	/// Ermöglicht das erstellen einer Variable mit gestapeltem Wert, sodass überschreiben und zurücksetzen möglich ist.
	/// </summary>
	public class ValueStack<T> : Stack<T>
	{
		/// <summary>
		/// Erzeugt eine neue Instanz des ValueStacks und initialisiert diesen mit dem Standardwert.
		/// </summary>
		public ValueStack()
		{
			Push(default);
		}
	
		/// <summary>
		/// Erzeugt eine neue Instanz des ValueStacks und initialisiert diesen mit dem gegebenen Wert.
		/// </summary>
		/// <param name="initialValue">Der Wert, mit dem der Stack initialisiert werden soll.</param>
		public ValueStack(T initialValue)
		{
			Push(initialValue);
		}
	
		/// <summary>
		/// Setzt den Wert des Stacks auf den gegebenen Wert.
		/// </summary>
		/// <param name="value">Der Wert, auf den der Stack gesetzt werden soll.</param>
		/// <returns>Der gegebene Wert um Verkettung von Expression zu ermöglichen.</returns>
		public new T Push(T value)
		{
			base.Push(value);

			return value;
		}

		/// <summary>
		/// Popt den obersten Wert des Stacks, wenn der Stack nur noch einen Wert enthält, wird nicht gepopt und dieser zurückgegeben.
		/// </summary>
		public new T Pop()
		{
			if (Count == 1)
				return Peek();

			return base.Pop();
		}

		/// <summary>
		/// Gibt den aktuellen Wert des ValueStacks zurück.
		/// </summary>
		public T CurrentValue() => Peek();
    
		public static implicit operator T(ValueStack<T> stack) => stack.CurrentValue();
	}
}