Editor/Handles/ArchHandlers.cs
namespace Sunless.Architecture;

public interface IArchHandler {
	ArchKind Kind { get; }

	bool Draw( ArchTool tool, ArchSelection picked );
}

public sealed class ArchHandlers : ArchTable<ArchHandlers, ArchKind, IArchHandler> {
	protected override IEnumerable<IArchHandler> Standing() {
		yield return new ArchStairHandler();
		yield return new ArchStairStepHandler();
		yield return new ArchCarvedStairHandler();
		yield return new ArchExteriorStairHandler();
		yield return new ArchPillarHandler();
		yield return new ArchSpanHandler();
		yield return new ArchPipeHandler();
		yield return new ArchBracketHandler();
		yield return new ArchPorchHandler();
		yield return new ArchWalkwayHandler();
		yield return new ArchBridgeHandler();
		yield return new ArchTunnelHandler();
	}

	protected override ArchKind KeyOf( IArchHandler handler ) => handler.Kind;

	protected override bool Accepts( IArchHandler handler ) => handler.Kind.Known;

	protected override string Collision( IArchHandler standing, IArchHandler handler ) {
		return $"{handler.Kind.Ident} is handled by both {standing.GetType().Name} and {handler.GetType().Name}";
	}

	public IArchHandler For( ArchKind kind ) => Held( kind );

	public ArchHandlers Except( ArchKind kind ) => Without( kind );
}