diff --git a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs
index 3b5c515..69bd40f 100644
--- a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs
+++ b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs
@@ -8,7 +8,7 @@ namespace Ramstack.FileProviders.Composition;
public static class FileProviderComposer
{
///
- /// Tries to flatten the specified into a flat list of file providers.
+ /// Attempts to flatten the specified into a flat list of file providers.
///
///
/// If the is not a ,
@@ -16,40 +16,68 @@ public static class FileProviderComposer
///
/// The to flatten.
///
- /// A that represents the flattened version of the specified .
+ /// An representing the flattened version from the specified .
+ ///
+ public static IFileProvider Flatten(this IFileProvider provider) =>
+ FlattenProvider(provider);
+
+ ///
+ /// Attempts to flatten the specified into a flat list of file providers.
+ ///
+ ///
+ /// If the is not a ,
+ /// the same instance of the is returned.
+ ///
+ /// The to flatten.
+ ///
+ /// An representing the flattened version from the specified .
///
public static IFileProvider FlattenProvider(IFileProvider provider)
{
- if (provider is CompositeFileProvider composite)
- foreach (var p in composite.FileProviders)
+ while (provider is CompositeFileProvider composite)
+ {
+ var providers = composite.FileProviders as IFileProvider[] ?? composite.FileProviders.ToArray();
+ if (providers.Length == 0)
+ return new NullFileProvider();
+
+ if (providers.Length == 1)
+ {
+ provider = providers[0];
+ continue;
+ }
+
+ foreach (var p in providers)
if (p is CompositeFileProvider or NullFileProvider)
- return ComposeProviders(composite.FileProviders);
+ return ComposeProviders(providers);
+
+ break;
+ }
return provider;
}
///
- /// Creates a provider from the specified list of and flattens it into a flat list of file providers.
+ /// Creates a provider from the specified list of instances and flattens it into a flat list of file providers.
///
///
/// This method returns a if more than one provider remains after flattening.
///
/// The list of instances to compose and flatten.
///
- /// A that represents the flattened version of the specified list of providers.
+ /// An representing the flattened version from the specified list of providers.
///
public static IFileProvider ComposeProviders(params IFileProvider[] providers) =>
ComposeProviders(providers.AsEnumerable());
///
- /// Creates a provider from the specified list of and flattens it into a flat list of file providers.
+ /// Creates a provider from the specified list of instances and flattens it into a flat list of file providers.
///
///
/// This method returns a if more than one provider remains after flattening.
///
/// The list of instances to compose and flatten.
///
- /// A that represents the flattened version of the specified list of providers.
+ /// An representing the flattened version from the specified list of providers.
///
public static IFileProvider ComposeProviders(IEnumerable providers)
{
diff --git a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs
index f36b200..461abb1 100644
--- a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs
+++ b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs
@@ -4,7 +4,7 @@
public sealed class FileProviderComposerTests
{
[Test]
- public void FlattenFileProvider_ReturnsAsIs_WhenNoComposite()
+ public void Flatten_ReturnsAsIs_WhenNoComposite()
{
var provider = new TestFileProvider();
var result = FileProviderComposer.FlattenProvider(provider);
@@ -12,7 +12,7 @@ public void FlattenFileProvider_ReturnsAsIs_WhenNoComposite()
}
[Test]
- public void FlattenFileProvider_ReturnsCompositeProvider_WhenNeedComposite()
+ public void Flatten_ReturnsCompositeProvider_WhenNeedComposite()
{
var provider = new CompositeFileProvider(new TestFileProvider(), new TestFileProvider());
@@ -21,7 +21,7 @@ public void FlattenFileProvider_ReturnsCompositeProvider_WhenNeedComposite()
}
[Test]
- public void FlattenFileProvider_ReturnsAsIs_WhenAlreadyFlat()
+ public void Flatten_ReturnsAsIs_WhenAlreadyFlat()
{
var provider = new CompositeFileProvider(new TestFileProvider(), new TestFileProvider());
@@ -30,7 +30,7 @@ public void FlattenFileProvider_ReturnsAsIs_WhenAlreadyFlat()
}
[Test]
- public void FlattenFileProvider_ReturnsCompositeProvider_Flattened()
+ public void Flatten_ReturnsCompositeProvider_Flattened()
{
var provider = new CompositeFileProvider(
new TestFileProvider(),
@@ -48,7 +48,7 @@ public void FlattenFileProvider_ReturnsCompositeProvider_Flattened()
}
[Test]
- public void FlattenFileProvider_RemovesNullFileProvider()
+ public void Flatten_RemovesNullFileProvider()
{
var provider = new CompositeFileProvider(
new TestFileProvider(),
@@ -66,7 +66,7 @@ public void FlattenFileProvider_RemovesNullFileProvider()
}
[Test]
- public void FlattenFileProvider_ReturnsNullFileProvider_WhenNothingReturn()
+ public void Flatten_ReturnsNullFileProvider_WhenNothingReturn()
{
var provider = new CompositeFileProvider(
new CompositeFileProvider(
@@ -107,7 +107,7 @@ public void FlattenFileProvider_ReturnsNullFileProvider_WhenNothingReturn()
}
[Test]
- public void FlattenFileProvider_ReturnsSingleProvider_WhenRemainOneProvider()
+ public void Flatten_ReturnsSingleProvider_WhenRemainOneProvider()
{
var provider = new CompositeFileProvider(
new CompositeFileProvider(
@@ -148,7 +148,7 @@ public void FlattenFileProvider_ReturnsSingleProvider_WhenRemainOneProvider()
}
[Test]
- public void FlattenFileProvider_MaintainOrder_WhenComposite()
+ public void Flatten_MaintainOrder_WhenComposite()
{
var p1 = new TestFileProvider();
var p2 = new TestFileProvider();
@@ -208,6 +208,20 @@ public void FlattenFileProvider_MaintainOrder_WhenComposite()
Assert.That(composite.FileProviders, Is.EquivalentTo(providers));
}
+ [Test]
+ public void Flatten_ReturnsSingleProvider_WhenCompositeContainsOnlyOne()
+ {
+ var provider = new CompositeFileProvider(new TestFileProvider()).Flatten();
+ Assert.That(provider, Is.InstanceOf());
+ }
+
+ [Test]
+ public void Flatten_EmptyComposite_ReturnsNullProvider()
+ {
+ var provider = new CompositeFileProvider().Flatten();
+ Assert.That(provider, Is.InstanceOf());
+ }
+
private sealed class TestFileProvider : IFileProvider
{
public IFileInfo GetFileInfo(string subpath) =>