POC
This commit is contained in:
		
							
								
								
									
										53
									
								
								src/dawn/state/StateProvider.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/dawn/state/StateProvider.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
// Copyright (c) 2023 Dominic Masters
 | 
			
		||||
// 
 | 
			
		||||
// This software is released under the MIT License.
 | 
			
		||||
// https://opensource.org/licenses/MIT
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
#include "state/State.hpp"
 | 
			
		||||
 | 
			
		||||
namespace Dawn {
 | 
			
		||||
  class SceneItemComponent;
 | 
			
		||||
 | 
			
		||||
  template<typename D, typename...A>
 | 
			
		||||
  struct StateListener {
 | 
			
		||||
    std::function<void(A...)> callback;
 | 
			
		||||
    D data;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template<typename D, typename...A>
 | 
			
		||||
  struct StateProviderSet {
 | 
			
		||||
    private:
 | 
			
		||||
      std::vector<StateListener<D,A...>> listeners;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
      std::function<void()> addEffect(
 | 
			
		||||
        std::function<void(A...)> callback,
 | 
			
		||||
        D data
 | 
			
		||||
      ) {
 | 
			
		||||
        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();
 | 
			
		||||
        }, 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);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user