MemoryStream underlyingStream = new();
MonitoringStream stream = new(underlyingStream);
stream.DidWrite += (s, e) =>
Console.WriteLine($"DidWrite: {Encoding.UTF8.GetString(e)} ({e.Count})");
stream.DidWriteSpan += (s, e) =>
Console.WriteLine($"DidWriteSpan: {Encoding.UTF8.GetString(e)} ({e.Length})");
stream.DidWriteMemory += (s, e) =>
Console.WriteLine($"DidWriteMemory: {Encoding.UTF8.GetString(e.ToArray())} ({e.Length})");
stream.DidRead += (s, e) =>
Console.WriteLine($"DidRead: {Encoding.UTF8.GetString(e)} ({e.Count})");
stream.DidReadSpan += (s, e) =>
Console.WriteLine($"DidReadSpan: {Encoding.UTF8.GetString(e)} ({e.Length})");
stream.DidReadMemory += (s, e) =>
Console.WriteLine($"DidReadMemory: {Encoding.UTF8.GetString(e.ToArray())} ({e.Length})");
stream.Disposed += (s, e) =>
Console.WriteLine("Disposed");
await stream.WriteAsync(new ReadOnlyMemory<byte>(Encoding.ASCII.GetBytes("Hello World")));
await stream.ReadAsync(new byte[4096],0,4096);
await stream.ReadAsync(new Memory<byte>(new byte[4096]));
stream.Read(new Span<byte>(new byte[4096]));