File: EnumeratedOnceEnumerable.cs
Web Access
Project: src\test\Libraries\Microsoft.Extensions.AI.Tests\Microsoft.Extensions.AI.Tests.csproj (Microsoft.Extensions.AI.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
 
namespace Microsoft.Extensions.AI;
 
internal sealed class EnumeratedOnceEnumerable<T>(IEnumerable<T> items) : IEnumerable<T>
{
    private int _iterated;
 
    public IEnumerator<T> GetEnumerator()
    {
        if (Interlocked.Exchange(ref _iterated, 1) != 0)
        {
            throw new InvalidOperationException("This enumerable can only be enumerated once.");
        }
 
        foreach (var item in items)
        {
            yield return item;
        }
    }
 
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}