Skip to content

Commit

Permalink
Add overload in Progress.Create, Progress.CreateOnlyValueChanged to a…
Browse files Browse the repository at this point in the history
…void closure allocation
  • Loading branch information
kochounoyume committed Oct 6, 2024
1 parent 7c0f199 commit d9f55b4
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions src/UniTask/Assets/Plugins/UniTask/Runtime/Progress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ public static IProgress<T> Create<T>(Action<T> handler)
return new AnonymousProgress<T>(handler);
}

public static IProgress<T> Create<T, TState>(TState state, Action<T, TState> handler)
{
if (handler == null) return NullProgress<T>.Instance;
return new AnonymousProgress<T, TState>(handler, state);
}

public static IProgress<T> CreateOnlyValueChanged<T>(Action<T> handler, IEqualityComparer<T> comparer = null)
{
if (handler == null) return NullProgress<T>.Instance;
Expand All @@ -25,6 +31,16 @@ public static IProgress<T> CreateOnlyValueChanged<T>(Action<T> handler, IEqualit
#endif
}

public static IProgress<T> CreateOnlyValueChanged<T, TState>(TState state, Action<T, TState> handler, IEqualityComparer<T> comparer = null)
{
if (handler == null) return NullProgress<T>.Instance;
#if UNITY_2018_3_OR_NEWER
return new OnlyValueChangedProgress<T, TState>(handler, state, comparer ?? UnityEqualityComparer.GetDefault<T>());
#else
return new OnlyValueChangedProgress<T, TState>(handler, state, comparer ?? EqualityComparer<T>.Default);
#endif
}

sealed class NullProgress<T> : IProgress<T>
{
public static readonly IProgress<T> Instance = new NullProgress<T>();
Expand Down Expand Up @@ -54,6 +70,23 @@ public void Report(T value)
}
}

sealed class AnonymousProgress<T, TState> : IProgress<T>
{
readonly Action<T, TState> action;
readonly TState state;

public AnonymousProgress(Action<T, TState> action, TState state)
{
this.action = action;
this.state = state;
}

public void Report(T value)
{
action(value, state);
}
}

sealed class OnlyValueChangedProgress<T> : IProgress<T>
{
readonly Action<T> action;
Expand Down Expand Up @@ -83,5 +116,37 @@ public void Report(T value)
action(value);
}
}

sealed class OnlyValueChangedProgress<T, TState> : IProgress<T>
{
readonly Action<T, TState> action;
readonly TState state;
readonly IEqualityComparer<T> comparer;
bool isFirstCall;
T latestValue;

public OnlyValueChangedProgress(Action<T, TState> action, TState state, IEqualityComparer<T> comparer)
{
this.action = action;
this.state = state;
this.comparer = comparer;
this.isFirstCall = true;
}

public void Report(T value)
{
if (isFirstCall)
{
isFirstCall = false;
}
else if (comparer.Equals(value, latestValue))
{
return;
}

latestValue = value;
action(value, state);
}
}
}
}

0 comments on commit d9f55b4

Please sign in to comment.