Nodes/Math/Operator/Comparison/Ternary.cs
namespace Nodebox.Nodes;

[Register]
[Tag("Operator")]
[Alias("?:", "Switch")]
[Polymorphic(true)]
public class Ternary : Node
{
    public override (Pin[] In, Pin[] Out) InitialPins => (
        new Pin[] {
            Pin.New<bool>("Condition"),
            Pin.New<Polymorphic>("True"),
            Pin.New<Polymorphic>("False"),
        },
        
        new Pin[] {
            Pin.New<Polymorphic>("*")
        }
    );

	public override Node Polymorph(PinWireChange change) {
        if (change.PinIndex == 0) return null;
        return PolymorphHelpers.ToConnectedTypeIfRegistered(typeof(Ternary<>), change);
    }
}


[Register(typeof(Library.All))]
[Polymorphic(typeof(Ternary))]
public class Ternary<T> : Ternary
{
    public override (Pin[] In, Pin[] Out) InitialPins => base.InitialPins.SubstitutePolymorphic<T>();
    public override void Evaluate() {
        SetOutput(0, GetInput<bool>(0) ? GetInput<T>(1) : GetInput<T>(2));
    }

    public override Node Polymorph(PinWireChange change) {
        if (change.Target.GetOutputWires().Any()) return null;
        if (change.Target.GetInputWires().Where(x => x.ToIndex != 0).Any()) return null;
        return PolymorphHelpers.ToNonGeneric<Ternary>();
    }
}