using System.Collections.Concurrent;
using System.Collections.Generic;
using Quobject.EngineIoClientDotNet.Modules;
using System;
namespace Quobject.EngineIoClientDotNet.ComponentEmitter
{
///
/// The event emitter which is ported from the JavaScript module.
/// https://github.com/component/emitter
///
public class Emitter
{
private ConcurrentDictionary> callbacks;
private ConcurrentDictionary _onceCallbacks;
public Emitter()
{
this.Off();
}
///
/// Executes each of listeners with the given args.
///
/// an event name.
///
/// a reference to this object.
public virtual Emitter Emit(string eventString, params object[] args)
{
//var log = LogManager.GetLogger(Global.CallerName());
//log.Info("Emitter emit event = " + eventString);
if (this.callbacks.ContainsKey(eventString))
{
List callbacksLocal = this.callbacks[eventString];
var listCopy = new List();
listCopy.AddRange(callbacksLocal);
foreach (var fn in listCopy)
{
fn.Call(args);
}
}
return this;
}
///
/// Listens on the event.
///
/// event name
///
/// a reference to this object
public Emitter On(string eventString, IListener fn)
{
if (!this.callbacks.ContainsKey(eventString))
{
//this.callbacks[eventString] = List();
this.callbacks.TryAdd(eventString,new List());
}
List callbacksLocal = this.callbacks[eventString];
callbacksLocal.Add(fn);
//this.callbacks[eventString] = callbacksLocal;
List outref;
this.callbacks.TryRemove(eventString, out outref);
this.callbacks.TryAdd(eventString, callbacksLocal);
return this;
}
///
/// Listens on the event.
///
/// event name
///
/// a reference to this object
public Emitter On(string eventString, Action fn)
{
var listener = new ListenerImpl(fn);
return this.On(eventString, listener);
}
///
/// Listens on the event.
///
/// event name
///
/// a reference to this object
public Emitter On(string eventString, Action