Files
LuaCsForBarotraumaEP/Libraries/BarotraumaLibs/BarotraumaCore/Utils/NamedEvent.cs
2024-03-28 18:34:33 +02:00

50 lines
1.4 KiB
C#

using System;
using System.Collections.Concurrent;
namespace Barotrauma
{
public sealed class NamedEvent<T> : IDisposable
{
private readonly ConcurrentDictionary<Identifier, Action<T>> events = new ConcurrentDictionary<Identifier, Action<T>>();
public void Register(Identifier identifier, Action<T> action)
{
if (!events.TryAdd(identifier, action))
{
throw new ArgumentException($"Event with the identifier \"{identifier}\" has already been registered.", nameof(identifier));
}
}
public void RegisterOverwriteExisting(Identifier identifier, Action<T> action)
{
events.AddOrUpdate(identifier, action, (k, v) => action);
}
public void Deregister(Identifier identifier)
{
events.TryRemove(identifier, out _);
}
public void TryDeregister(Identifier identifier)
{
if (!HasEvent(identifier)) { return; }
Deregister(identifier);
}
public bool HasEvent(Identifier identifier)
=> events.ContainsKey(identifier);
public void Invoke(T data)
{
foreach (var (_, action) in events)
{
action?.Invoke(data);
}
}
public void Dispose()
{
events.Clear();
}
}
}