namespace Buckets.Logic { public abstract class Container { private int content; public delegate void FullEventHandler(Container container, EventArgs eventArgs); public delegate void OverflowEventHandler(Container container, OverflowEventArgs eventArgs); public event FullEventHandler? Full; public event OverflowEventHandler? Overflowed; public int Capacity { get; } public int Content { get => content; set { ArgumentOutOfRangeException.ThrowIfNegative(value, nameof(Content)); if (value == Capacity) { Full?.Invoke(this, new()); } else if (value > Capacity) { Overflowed?.Invoke(this, new(value - Capacity)); } content = Math.Min(value, Capacity); } } public Container(int capacity, int content) { ArgumentOutOfRangeException.ThrowIfNegative(capacity, nameof(Capacity)); Capacity = capacity; Content = content; } public void Fill(int amount) { Content += amount; } public void Empty(int amount) { Content -= amount; } public void Empty() { Content = 0; } } }