ln.types/io/LineWriter.cs

56 lines
1.4 KiB
C#

using System;
using System.IO;
using System.Text;
namespace ln.types.io
{
public delegate void LineReceivedDelegate(object sender, string line);
public class LineWriter : TextWriter
{
public event LineReceivedDelegate LineReceived;
public override Encoding Encoding => Encoding.UTF8;
private void FireLineReceived(string line) => LineReceived?.Invoke(this, line);
char[] lineBuffer = new char[8192];
int cursor = 0;
String CurrentLineBuffer => new string(lineBuffer, 0, cursor);
public LineWriter()
{
}
public override void Write(char value)
{
lock (this)
{
if (value == '\n')
{
FireLineReceived(CurrentLineBuffer);
cursor = 0;
} else if (cursor < lineBuffer.Length)
{
lineBuffer[cursor++] = value;
}
}
}
public override void WriteLine() => Write('\n');
public override void WriteLine(string value)
{
lock (this)
{
if (cursor > 0)
{
value = CurrentLineBuffer + value;
cursor = 0;
}
FireLineReceived(value);
}
}
}
}