Utility that enumerates architecture plan hosts by runtime Type. Of(plan, types) yields all matching host objects for each Type by calling HostsOf which maps specific Types (ArchBuilding, ArchRoom, ArchRoofPart, ArchWall, ArchPorchPart, ArchRoadPart) to the corresponding collections on ArchPlan.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Sunless.Architecture;
// Every host of a given type standing in the plan - ONE walk for Unfile, derived from the walks the manifests
// carried by hand.
public static class ArchPlanHosts
{
public static IEnumerable<object> Of( ArchPlan plan, IEnumerable<Type> types )
{
if ( plan is null || types is null )
{
yield break;
}
foreach ( var type in types )
{
foreach ( var host in HostsOf( plan, type ) )
{
yield return host;
}
}
}
static IEnumerable<object> HostsOf( ArchPlan plan, Type type )
{
if ( type == typeof( ArchBuilding ) )
{
return plan.Buildings;
}
if ( type == typeof( ArchRoom ) )
{
return plan.AllRooms();
}
if ( type == typeof( ArchRoofPart ) )
{
return plan.AllRoofs();
}
if ( type == typeof( ArchWall ) )
{
return plan.AllWalls();
}
if ( type == typeof( ArchPorchPart ) )
{
return plan.AllRooms().SelectMany( room => room.Porches );
}
if ( type == typeof( ArchRoadPart ) )
{
return plan.Roads();
}
return Array.Empty<object>();
}
}