#line 1 "monoid/monoids/or_monoid.hpp"
#line 1 "monoid/monoid.hpp"
#include<concepts>
#include<functional>
#include<type_traits>namespacem1une{template<typenameT,autooperation,autoidentity,boolcommutative>structmonoid{static_assert(std::is_invocable_r_v<T,decltype(operation),T,T>,"operation must work as T(T, T)");static_assert(std::is_invocable_r_v<T,decltype(identity)>,"identity must work as T()");usingvalue_type=T;staticconstexprautoop=operation;staticconstexprautoid=identity;staticconstexprboolis_commutative=commutative;};template<typenameT>conceptMonoid=requires(typenameT::value_typev){typenameT::value_type;{T::op(v,v)}->std::same_as<typenameT::value_type>;{T::id()}->std::same_as<typenameT::value_type>;{T::is_commutative}->std::convertible_to<bool>;};}// namespace m1une#line 5 "monoid/monoids/or_monoid.hpp"
namespacem1une{template<typenameT>usingor_monoid=monoid<T,[](Ta,Tb){returna|b;},[](){returnT(0);},true>;}// namespace m1une