This commit is contained in:
2023-03-10 08:35:57 -08:00
parent f69312e9f9
commit 5c6436dd18
6 changed files with 161 additions and 106 deletions

View File

@ -7,8 +7,6 @@
#include "state/State.hpp"
namespace Dawn {
class SceneItemComponent;
template<typename D, typename...A>
struct StateListener {
std::function<void(A...)> callback;
@ -17,37 +15,34 @@ namespace Dawn {
template<typename D, typename...A>
struct StateProviderSet {
private:
public:
std::vector<StateListener<D,A...>> listeners;
public:
/**
* Attaches an effect listener that is invoked by a provider.
*
* @tparam T Context Type, usually the state listener itself.
* @param callback Callback method to be invoked by the provider.
* @param data Data to be stored with the StateListener.
* @param context Context for the state object.
* @return The unsubscribe method, when invoked, unsubs from the provider.
*/
template<class T>
std::function<void()> addEffect(
std::function<void(A...)> callback,
D data
D data,
T *context
) {
struct StateListener<D, A...> l;
l.callback = callback;
l.data = data;
this->listeners.push_back(l);
l.callback();
return std::bind([&](struct StateListener<D, A...> listener) {
assertUnreachable();
auto it = std::find(listeners.begin(), listeners.end(), listener);
assertFalse(it == listeners.end());
listeners.erase(it);
}, l);
}
};
class TimeProvider {
public:
StateProviderSet<float_t> effect;
};
std::function<void()> useTimeout(
std::function<void()> someCallback,
float_t timeout,
SceneItemComponent *context
) {
return (TimeProvider()).effect.addEffect(someCallback, timeout);
}
}