Skip to content

[API Proposal]: Add possibility to create ReadOnlySequence<T> with multiple segments. #111570

Open
@paulomorgado

Description

Background and motivation

ReadOnlySequence<T> has APIs to create empty or single-segment instances, but there's no on-the-box help for creating multiple-segment instances.

The first thing a user needs to do is create a ReadOnlySequenceSegment<T> derived class.

API Proposal

ASP.NET Core has a few implementations of this:

internal sealed class BufferSegment : ReadOnlySequenceSegment<byte>
{
    public BufferSegment(Memory<byte> memory)
    {
        Memory = memory;
    }
 
    public BufferSegment Append(ReadOnlyMemory<byte> memory)
    {
        var segment = new BufferSegment(memory)
        {
            RunningIndex = RunningIndex + Memory.Length
        };
        Next = segment;
        return segment;
    }
}

Just having a public implementation would go a long way helping users.

I know there are a few more elaborated implementations, but just having this would help a lot.

Adding to that, simple APIs to create from IEnumerable<IEnumerable<T>>

new ReadOnlySequence<T>(IEnumerable<IEnumerable<T>> source);
new ReadOnlySequence<T,U>(U source, Func<U, IEnumerable<IEnumerable<T>> sourceSelector, Func<IEnumerable<T>,ReadOnlyMemory<T>> segmentSelector);

API Usage

ReadOnlySequence<byte> Transform(ReadOnlySequence<byte> source, Func<ReadOnlyMemory<byte>, ReadOnlyMemory<byte>> transform)
{
    var e = source.GetEnumerable();

    if (!e.MoveNext())
    {
        return ReadOnlySequence<byte>.Empty;
    }

    ReadOnlySequenceSegment<T>? first = null;
    ReadOnlySequenceSegment<T> last;

    do
    {
        if (first is null)
        {
            last = first = new BufferSegment(transform(e.Current));
        }
        else
        {
            last = last.Append(transform(e.Current));
        }
    }
    while (e.MoveNext());

    return new ReadOnlySequence<byte>(first, 0, last, last.Memory.Length);
}

Alternative Designs

No response

Risks

No response

Metadata

Assignees

No one assigned

    Labels

    api-suggestionEarly API idea and discussion, it is NOT ready for implementationarea-System.MemoryuntriagedNew issue has not been triaged by the area owner

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions