// Copyright (c) Microsoft. All rights reserved. #if NET using System; #endif using System.Collections.Generic; using System.Linq; #if NET using System.Runtime.CompilerServices; #else using System.Text; #endif namespace Microsoft.Extensions.AI; /// Internal extensions for working with . internal static class AIContentExtensions { /// Concatenates the text of all instances in the list. public static string ConcatText(this IEnumerable contents) { if (contents is IList list) { int count = list.Count; switch (count) { case 0: return string.Empty; case 1: return (list[0] as TextContent)?.Text ?? string.Empty; default: #if NET DefaultInterpolatedStringHandler builder = new(count, 0, null, stackalloc char[512]); for (int i = 0; i < count; i++) { if (list[i] is TextContent text) { builder.AppendLiteral(text.Text); } } return builder.ToStringAndClear(); #else StringBuilder builder = new(); for (int i = 0; i < count; i++) { if (list[i] is TextContent text) { builder.Append(text.Text); } } return builder.ToString(); #endif } } return string.Concat(contents.OfType()); } /// Concatenates the of all instances in the list. /// A newline separator is added between each non-empty piece of text. public static string ConcatText(this IList messages) { int count = messages.Count; switch (count) { case 0: return string.Empty; case 1: return messages[0].Text; default: #if NET DefaultInterpolatedStringHandler builder = new(count, 0, null, stackalloc char[512]); bool needsSeparator = false; for (int i = 0; i < count; i++) { string text = messages[i].Text; if (text.Length > 0) { if (needsSeparator) { builder.AppendLiteral(Environment.NewLine); } builder.AppendLiteral(text); needsSeparator = true; } } return builder.ToStringAndClear(); #else StringBuilder builder = new(); for (int i = 0; i < count; i++) { string text = messages[i].Text; if (text.Length > 0) { if (builder.Length > 0) { builder.AppendLine(); } builder.Append(text); } } return builder.ToString(); #endif } } }