# Simple Immutable Stack in C#
```csharp
public record SimpleImmutableStack<T> : IEnumerable<T> where T : class
{
private record _Empty() : SimpleImmutableStack<T>(null, null)
{
public override bool IsEmpty => true;
public override SimpleImmutableStack<T> Pop() => throw new InvalidOperationException("Stack is empty");
public override T Peek() => throw new InvalidOperationException("Stack is empty");
}
public static readonly SimpleImmutableStack<T> Empty = new _Empty();
private readonly T Head;
private readonly SimpleImmutableStack<T> Tail;
private SimpleImmutableStack(T head, SimpleImmutableStack<T> tail)
{
Head = head;
Tail = tail;
}
public virtual bool IsEmpty => false;
public SimpleImmutableStack<T> Push(T value) => new(value, this);
public virtual SimpleImmutableStack<T> Pop() => Tail;
public virtual T Peek() => Head;
public IEnumerator<T> GetEnumerator()
{
IEnumerable<T> Inner()
{
var current = this;
while (current.IsEmpty == false)
{
yield return current.Head;
current = current.Tail;
}
}
return Inner().GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
```