using System;
using System.Collections.Generic;
namespace StardewModdingAPI.Framework.Utilities
{
/// A wrapper meant for tracking recursive contexts.
/// The key type.
internal class ContextHash : HashSet
{
/*********
** Public methods
*********/
/// Construct an instance.
public ContextHash() { }
/// Construct an instance.
/// The implementation to use when comparing values in the set, or null to use the default comparer for the set type.
public ContextHash(IEqualityComparer comparer)
: base(comparer) { }
/// Add a key while an action is in progress, and remove it when it completes.
/// The key to add.
/// The action to perform.
/// The specified key is already added.
public void Track(T key, Action action)
{
if (this.Contains(key))
throw new InvalidOperationException($"Can't track context for key {key} because it's already added.");
this.Add(key);
try
{
action();
}
finally
{
this.Remove(key);
}
}
/// Add a key while an action is in progress, and remove it when it completes.
/// The value type returned by the method.
/// The key to add.
/// The action to perform.
public TResult Track(T key, Func action)
{
if (this.Contains(key))
throw new InvalidOperationException($"Can't track context for key {key} because it's already added.");
this.Add(key);
try
{
return action();
}
finally
{
this.Remove(key);
}
}
}
}