#pragma once
#include<optional>namespacehaar_lib{template<typenameSemigroup>structmaybe_monoid{usingvalue_type=std::optional<typenameSemigroup::value_type>;conststaticSemigroupS;value_typeoperator()()const{returnstd::nullopt;}value_typeoperator()(constvalue_type&a,constvalue_type&b)const{if(nota)returnb;if(notb)returna;return{S(*a,*b)};}};}// namespace haar_lib