// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information.
using System.Collections.Generic;
namespace System.Linq
{
public static partial class EnumerableEx
{
///
/// Generates a sequence that's dependent on a resource object whose lifetime is determined by the sequence usage
/// duration.
///
/// Source element type.
/// Resource type.
/// Resource factory function.
/// Enumerable factory function, having access to the obtained resource.
/// Sequence whose use controls the lifetime of the associated obtained resource.
public static IEnumerable Using(Func resourceFactory, Func> enumerableFactory) where TResource : IDisposable
{
if (resourceFactory == null)
throw new ArgumentNullException(nameof(resourceFactory));
if (enumerableFactory == null)
throw new ArgumentNullException(nameof(enumerableFactory));
return UsingCore(resourceFactory, enumerableFactory);
}
private static IEnumerable UsingCore(Func resourceFactory, Func> enumerableFactory) where TResource : IDisposable
{
using var res = resourceFactory();
foreach (var item in enumerableFactory(res))
{
yield return item;
}
}
}
}