File: src\Components\Endpoints\src\FormMapping\Converters\CollectionAdapters\ImmutableStackBufferAdapter.cs
Web Access
Project: src\src\Http\Http.Extensions\src\Microsoft.AspNetCore.Http.Extensions.csproj (Microsoft.AspNetCore.Http.Extensions)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Immutable;
using System.Linq;
 
namespace Microsoft.AspNetCore.Components.Endpoints.FormMapping;
 
internal sealed class ImmutableStackBufferAdapter<TElement>
    : ArrayPoolBufferAdapter<ImmutableStack<TElement>, ImmutableStackBufferAdapter<TElement>.ImmutableStackFactory, TElement>
{
    internal class ImmutableStackFactory : ICollectionFactory<ImmutableStack<TElement>, TElement>
    {
        public static ImmutableStack<TElement> ToResultCore(TElement[] buffer, int size)
        {
            return ImmutableStack.CreateRange(buffer.Take(size));
        }
    }
 
    public static CollectionConverter<IImmutableStack<TElement>> CreateInterfaceConverter(FormDataConverter<TElement> elementConverter)
    {
        return new CollectionConverter<
            IImmutableStack<TElement>,
            StaticCastAdapter<
                IImmutableStack<TElement>,
                ImmutableStack<TElement>,
                ImmutableStackBufferAdapter<TElement>,
                PooledBuffer,
                TElement>,
            PooledBuffer,
            TElement>(elementConverter);
    }
}
 
internal class StaticCastAdapter<TCollectionInterface, TCollectionImplementation, TCollectionAdapter, TBuffer, TElement>
    : ICollectionBufferAdapter<TCollectionInterface, TBuffer, TElement>
    where TCollectionAdapter : ICollectionBufferAdapter<TCollectionImplementation, TBuffer, TElement>
    where TCollectionImplementation : TCollectionInterface
{
    public static TBuffer CreateBuffer() => TCollectionAdapter.CreateBuffer();
 
    public static TBuffer Add(ref TBuffer buffer, TElement element) => TCollectionAdapter.Add(ref buffer, element);
 
    public static TCollectionInterface ToResult(TBuffer buffer) => TCollectionAdapter.ToResult(buffer);
}