canto/Assets/Scripts/Extension/Atom/AtomExtensions.cs
2025-10-02 15:28:03 -04:00

26 lines
928 B
C#

using R3;
using UnityAtoms;
namespace KitsuneCafe.Extension
{
public static class AtomExtensions
{
public static Observable<T> ObserveChange<T, P, C, V, E1, E2, F, VI>(this AtomReference<T, P, C, V, E1, E2, F, VI> reference)
where C : AtomBaseVariable<T>
where V : AtomVariable<T, P, E1, E2, F>
where P : struct, IPair<T>
where E1 : AtomEvent<T>
where E2 : AtomEvent<P>
where F : AtomFunction<T, T>
where VI : AtomVariableInstancer<V, P, T, E1, E2, F>
{
return reference.Usage switch
{
AtomReferenceUsage.CONSTANT => Observable.Return(reference.Value),
AtomReferenceUsage.VALUE => Observable.EveryValueChanged(reference, r => r.Value),
AtomReferenceUsage.VARIABLE or AtomReferenceUsage.VARIABLE_INSTANCER => reference.GetEvent<E1>().Observe().ToObservable(),
_ => throw new System.NotImplementedException(),
};
}
}
}