using System.Text;
namespace XFESystem.Console;
/// <summary>A serialized TextWriter for a graphical terminal model. It does not replace runtime console PAL calls.</summary>
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<char> 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<char> 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<char> 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();
}
}
using System.Text;
namespace XFESystem.Console;
/// <summary>A serialized TextWriter for a graphical terminal model. It does not replace runtime console PAL calls.</summary>
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<char> 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<char> 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<char> 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();
}
}