using System;
using System.Collections.Generic;
using UnityEngine;
namespace VoxelBusters.CoreLibrary
{
///
/// Generic callback definition for operations.
///
public delegate void Callback();
///
/// Generic callback definition for events.
///
public delegate void Callback(TResult result);
///
/// Generic callback definition for operations.
///
public delegate void CompletionCallback(Error error);
///
/// Generic callback definition for operations.
///
public delegate void EventCallback(TResult result, Error error);
public class CallbackDispatcher : PrivateSingletonBehaviour
{
#region Fields
private Queue m_queue = new Queue();
#endregion
#region Static methods
public static CallbackDispatcher Initialize()
{
return GetSingleton();
}
public static void InvokeOnMainThread(Callback callback)
{
// validate arguments
if (callback == null)
{
//DebugLogger.LogWarning("Callback is null.");
return;
}
// add request to queue
var manager = GetSingleton();
if (manager)
{
manager.AddAction(action: () => callback.Invoke());
}
}
public static void InvokeOnMainThread(CompletionCallback callback, Error error)
{
// validate arguments
if (callback == null)
{
//DebugLogger.LogWarning("Callback is null.");
return;
}
// add request to queue
var manager = GetSingleton();
if (manager)
{
manager.AddAction(action: () => callback.Invoke(error));
}
}
public static void InvokeOnMainThread(Callback callback, TResult result)
{
// validate arguments
if (callback == null)
{
//DebugLogger.LogWarning("Callback is null.");
return;
}
// add request to queue
var manager = GetSingleton();
if (manager)
{
manager.AddAction(() => callback.Invoke(result));
}
}
public static void InvokeOnMainThread(EventCallback callback, IOperationResultContainer resultContainer)
{
InvokeOnMainThread(callback, resultContainer.GetResult(), resultContainer.GetError());
}
public static void InvokeOnMainThread(EventCallback callback, TResult result, Error error)
{
// validate arguments
if (callback == null)
{
//DebugLogger.LogWarning("Callback is null.");
return;
}
// add request to queue
var manager = GetSingleton();
if (manager)
{
manager.AddAction(() => callback.Invoke(result, error));
}
}
#endregion
#region Unity methods
private void LateUpdate()
{
try
{
// execute pending actions
while (m_queue.Count > 0)
{
var action = m_queue.Dequeue();
action();
}
}
catch (Exception expection)
{
DebugLogger.LogException(expection);
}
}
#endregion
#region Private methods
private void AddAction(Action action)
{
m_queue.Enqueue(action);
}
#endregion
}
}