AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="1.1.1" />

 StringTextSource

Char array based immutable text source
using AngleSharp.Common; using System; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Text { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class StringTextSource : IReadOnlyTextSource, IDisposable { private readonly string _string; [System.Runtime.CompilerServices.Nullable(0)] private readonly ReadOnlyMemory<char> _memory; private readonly int _length; private int _index; public string Text => _string; public char this[int index] { get { return _string[index]; } } public int Length => _length; public Encoding CurrentEncoding { get { return TextEncoding.Utf8; } set { } } public int Index { get { return _index; } set { _index = value; } } public StringTextSource(string source) { _string = source; _length = source.Length; _memory = source.AsMemory(); } public void Dispose() { } public char ReadCharacter() { if (_index < _length) return _string[_index++]; _index++; return '￿'; } public string ReadCharacters(int characters) { return ReadMemory(characters).ToString(); } public StringOrMemory ReadMemory(int characters) { int index = _index; if (index + characters <= _length) { _index += characters; return _memory.Slice(index, characters); } _index += characters; characters = Math.Min(characters, _length - index); return _memory.Slice(index, characters); } public Task PrefetchAsync(int length, CancellationToken cancellationToken) { return Task.CompletedTask; } public Task PrefetchAllAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } public bool TryGetContentLength(out int length) { length = _length; return true; } } }