supyrb / signals

❇ A typesafe, lightweight messaging system for Unity with UPM Support.

Home Page:https://github.com/supyrb/signals

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Static Interface to reduce Signals.Get() overhead

Benjamin-Justice opened this issue · comments

Hi,

I propose a static interface to reduce the Signals.Get() overhead, when I just want to add quick Listeners to events.

e.g.

Signals.AddListener<OnEnterSafeZoneSignal>(OnEnterSafeZone);
Signals.Dispatch<OnEnterSafeZoneSignal>();

When dispatching signals with parameters, the interface would be a little cluttered (but typesafe and consistent). Not sure if it's needed though.

I would also like to look into this myself

Hi @Benjamin-Justice,

even though it might clutter the Signals class a bit, I think your proposal adds value in usability and helps readability when not wanting to cache the signal (which has a performance benefit, when using the signal extensively.

This would be the changes syntax with all its use cases

// Add signals
// From
Signals.Get<BasicExampleSignal>().AddListener(DefaultListener);
Signals.Get<BasicExampleSignal>().AddListener(FirstListener, -100);
// To
Signals.AddListener<BasicExampleSignal>(DefaultListener);
Signals.AddListener<BasicExampleSignal>(FirstListener, -100);

// Remove signals
// From
Signals.Get<BasicExampleSignal>().RemoveListener(DefaultListener);
// To
Signals.RemoveListener<BasicExampleSignal>(DefaultListener);


// Dispatching with support to up to three parameters
// From
Signals.Get<NoArgumentSignalTest>().Dispatch();
Signals.Get<OneArgumentSignalTest>().Dispatch(t);
Signals.Get<TwoArgumentSignalTest>().Dispatch(t, u);
Signals.Get<ThreeArgumentSignalTest>().Dispatch(t, u, v);
// To
Signals.Dispatch<NoArgumentSignalTest>();
Signals.Dispatch<OneArgumentSignalTest>(t);
Signals.Dispatch<TwoArgumentSignalTest>(t, u);
Signals.Dispatch<ThreeArgumentSignalTest>(t, u, v);


// Additional functionality
// From
Signals.Get<BasicExampleSignal>().Pause();
// To
Signals.Pause<BasicExampleSignal>();

// From
Signals.Get<BasicExampleSignal>().Continue();
// To
Signals.Continue<BasicExampleSignal>();

// From
Signals.Get<BasicExampleSignal>().Consume();
// To
Signals.Consume<BasicExampleSignal>();