#pragma once
#include <frc/filter/Debouncer.h>
#include <functional>
#include <memory>
#include <units/time.h>
#include <wpi/FunctionExtras.h>
#include "EventLoop.h"
namespace frc {
class BooleanEvent {
public:
BooleanEvent(EventLoop* loop, std::function<bool()> signal);
bool GetAsBoolean() const;
operator std::function<bool()>();
void IfHigh(std::function<void()> action);
template <class T>
T CastTo(std::function<T(EventLoop*, std::function<bool()>)> ctor =
[](EventLoop* loop, std::function<bool()> condition) {
return T(loop, condition);
}) {
return ctor(m_loop, [state = m_state] { return *state; });
}
BooleanEvent operator!();
BooleanEvent operator&&(std::function<bool()> rhs);
BooleanEvent operator||(std::function<bool()> rhs);
BooleanEvent Rising();
BooleanEvent Falling();
BooleanEvent Debounce(units::second_t debounceTime,
frc::Debouncer::DebounceType type =
frc::Debouncer::DebounceType::kRising);
private:
EventLoop* m_loop;
std::function<bool()> m_signal;
std::shared_ptr<bool> m_state;
};
}