rj-action-library/Runtime/Events/EventSlot.cs

102 lines
1.9 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Text;
using System;
using System.Linq;
namespace Rokojori
{
public class EventSlot<T>
{
protected List<Action<T>> _actions = new List<Action<T>>();
List<Action<T>> _once = new List<Action<T>>();
protected bool _canModify = true;
List<Action<T>> _additions = new List<Action<T>>();
List<Action<T>> _onceAdditions = new List<Action<T>>();
List<Action<T>> _removals = new List<Action<T>>();
public bool hasListeners => _once.Count > 0 || _actions.Count > 0;
public void AddAction( Action<T> action )
{
if ( _canModify )
{
_actions.Add( action );
}
else
{
_additions.Add( action );
}
}
public void RemoveAction( Action<T> action )
{
if ( _canModify )
{
_actions.Remove( action );
}
else
{
_removals.Add( action );
}
}
public void Once( Action<T> action )
{
if ( _canModify )
{
_actions.Add( action );
_once.Add( action );
}
else
{
_onceAdditions.Add( action );
}
}
protected void _UpdateLists()
{
_once.ForEach( a => { _actions.Remove( a ); } );
_once.Clear();
if ( _removals.Count > 0 )
{
Lists.RemoveRange( _actions, _removals );
_removals.Clear();
}
if ( _additions.Count > 0 )
{
_actions.AddRange( _additions );
_additions.Clear();
}
if ( _onceAdditions.Count > 0 )
{
_once.AddRange( _onceAdditions );
_actions.AddRange( _onceAdditions );
}
}
public void DispatchEvent( T t )
{
_canModify = false;
_actions.ForEach( a => { if ( a != null ){ a( t ); } } );
_UpdateLists();
_canModify = true;
}
}
}