Editor/MovieMaker/Signals/Operations/Blend.cs
using Sandbox.MovieMaker;

namespace Editor.MovieMaker;

#nullable enable

partial record PropertySignal<T>
{
	public PropertySignal<T> Blend( PropertySignal<T> second, float alpha )
	{
		if ( alpha <= 0f ) return this;
		if ( alpha >= 1f ) return second;

		if ( Equals( second ) )
		{
			return this;
		}

		return Interpolator.GetDefault<T>() is not null
			? new BlendOperation<T>( this, second, alpha )
			: this;
	}
}

[JsonDiscriminator( "Blend" )]
file sealed record BlendOperation<T>( PropertySignal<T> First, PropertySignal<T> Second, float Alpha ) : InterpolateOperation<T>( First, Second )
{
	public override float GetAlpha( MovieTime time ) => Alpha;

	protected override PropertySignal<T> OnSmooth( MovieTime size ) =>
		this with { First = First.Smooth( size ), Second = Second.Smooth( size ) };
}