// 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;
}
}
}