using System.Text; namespace XFESystem.Console; /// A serialized TextWriter for a graphical terminal model. It does not replace runtime console PAL calls. public sealed class TerminalTextWriter(TerminalBuffer buffer) : TextWriter { private readonly object gate = new(); public TerminalBuffer Buffer { get; } = buffer ?? throw new ArgumentNullException(nameof(buffer)); public override Encoding Encoding => Encoding.UTF8; public override void Write(char value) { lock (gate) { Span character = stackalloc char[1]; character[0] = value; Buffer.Write(character); } } public override void Write(string? value) { lock (gate) Buffer.Write(value); } public override void Write(ReadOnlySpan value) { lock (gate) Buffer.Write(value); } public override void WriteLine(string? value) { lock (gate) { Buffer.Write(value); Buffer.Write("\r\n"); } } // TextWriter's parameterless implementation uses the host NewLine. A // native Unix-target runtime supplies LF, while VT LF preserves column; // a logical writer line must return to column zero on every platform. public override void WriteLine() { lock (gate) Buffer.Write("\r\n"); } public override void WriteLine(ReadOnlySpan value) { lock (gate) { Buffer.Write(value); Buffer.Write("\r\n"); } } public TerminalSnapshot Snapshot() { lock (gate) return Buffer.Snapshot(); } public void Complete() { lock (gate) Buffer.Complete(); } }