// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using System.Buffers; using System.Diagnostics; namespace Microsoft.Teams.AI.Models.OpenAI.Builders; /// /// https://github.com/openai/openai-dotnet/blob/main/examples/Chat/Example04_FunctionCallingStreaming.cs#L74 /// [Obsolete("Microsoft.Teams.AI.Models.OpenAI is deprecated and will be removed by end of summer 2026.")] public class SequenceBuilder { Segment? _first; Segment? _last; public void Append(ReadOnlyMemory data) { if (_first is null) { Debug.Assert(_last is null); _first = new Segment(data); _last = _first; } else { _last = _last!.Append(data); } } public ReadOnlySequence Build() { if (_first is null) { Debug.Assert(_last is null); return ReadOnlySequence.Empty; } if (_first == _last) { Debug.Assert(_first.Next is null); return new ReadOnlySequence(_first.Memory); } return new ReadOnlySequence(_first, 0, _last!, _last!.Memory.Length); } private sealed class Segment : ReadOnlySequenceSegment { public Segment(ReadOnlyMemory items) : this(items, 0) { } private Segment(ReadOnlyMemory items, long runningIndex) { Debug.Assert(runningIndex >= 0); Memory = items; RunningIndex = runningIndex; } public Segment Append(ReadOnlyMemory items) { long runningIndex; checked { runningIndex = RunningIndex + Memory.Length; } Segment segment = new(items, runningIndex); Next = segment; return segment; } } }