Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@elringus
Created December 6, 2017 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elringus/c123be2c85a3fc419bd7924c4f55273b to your computer and use it in GitHub Desktop.
Save elringus/c123be2c85a3fc419bd7924c4f55273b to your computer and use it in GitHub Desktop.
Promise aggregation
using UnityCommon;
/// <summary>
/// Represents a set of async actions performed by a <see cref="INovelActor"/> over time.
/// </summary>
public class NovelActorPerformance : AsyncAction<INovelActor>
{
public INovelActor Actor { get { return State; } }
private int performancesCount;
public NovelActorPerformance (INovelActor actor) : base(actor)
{
actor.OnPerformanceCompleted += HandlePerformanceCompleted;
}
public NovelActorPerformance (params NovelActorPerformance[] performances)
{
performancesCount = performances.Length;
foreach (var performance in performances)
performance.OnCompleted += HandlePerformanceCompleted;
}
public override void CompleteInstantly ()
{
if (IsCompleted) return;
Actor.CompletePerformance(this);
}
public override void CompleteInstantly (INovelActor state)
{
CompleteInstantly();
}
private void HandlePerformanceCompleted (NovelActorPerformance performance)
{
if (performance != this) return;
Actor.OnPerformanceCompleted -= HandlePerformanceCompleted;
HandleOnCompleted();
}
private void HandlePerformanceCompleted (INovelActor actor)
{
performancesCount--;
if (performancesCount == 0)
HandleOnCompleted();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment