@@ -172,54 +172,60 @@ auto Pulse(const State<S>& state, const Event<E>& evnt) -> Event<S>
172172// /////////////////////////////////////////////////////////////////////////////////////////////////
173173// / Flatten
174174// /////////////////////////////////////////////////////////////////////////////////////////////////
175- template <typename S>
176- auto Flatten (const Group& group, const State<State<S>>& state) -> State<S>
175+ template <typename S, template <typename > class TState ,
176+ typename = std::enable_if_t <std::is_base_of_v<State<S>, TState<S>>>>
177+ auto Flatten (const Group& group, const State<TState<S>>& state) -> State<S>
177178{
178179 using REACT_IMPL::FlattenStateNode;
179180 using REACT_IMPL::SameGroupOrLink;
180181 using REACT_IMPL::CreateWrappedNode;
181182
182- return CreateWrappedNode<State<S>, FlattenStateNode<S>>(group, SameGroupOrLink (group, state));
183+ return CreateWrappedNode<State<S>, FlattenStateNode<S, TState >>(group, SameGroupOrLink (group, state));
183184}
184185
185- template <typename S>
186- auto Flatten (const State<State<S>>& state) -> State<S>
186+ template <typename S, template <typename > class TState ,
187+ typename = std::enable_if_t <std::is_base_of_v<State<S>, TState<S>>>>
188+ auto Flatten (const State<TState<S>>& state) -> State<S>
187189 { return Flatten (state.GetGroup (), state); }
188190
189191// /////////////////////////////////////////////////////////////////////////////////////////////////
190192// / FlattenList
191193// /////////////////////////////////////////////////////////////////////////////////////////////////
192- template <template <typename ...> class TList , typename V, typename ... TParams>
193- auto FlattenList (const Group& group, const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
194+ template <template <typename ...> class TList , template <typename > class TState , typename V, typename ... TParams,
195+ typename = std::enable_if_t <std::is_base_of_v<State<V>, TState<V>>>>
196+ auto FlattenList (const Group& group, const State<TList<TState<V>, TParams ...>>& list) -> State<TList<V>>
194197{
195198 using REACT_IMPL::FlattenStateListNode;
196199 using REACT_IMPL::SameGroupOrLink;
197200 using REACT_IMPL::CreateWrappedNode;
198201
199- return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, V, TParams ...>>(
202+ return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, TState, V, TParams ...>>(
200203 group, SameGroupOrLink (group, list));
201204}
202205
203- template <template <typename ...> class TList , typename V, typename ... TParams>
204- auto FlattenList (const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
206+ template <template <typename ...> class TList , template <typename > class TState , typename V, typename ... TParams,
207+ typename = std::enable_if_t <std::is_base_of_v<State<V>, TState<V>>>>
208+ auto FlattenList (const State<TList<TState<V>, TParams ...>>& list) -> State<TList<V>>
205209 { return FlattenList (list.GetGroup (), list); }
206210
207211// /////////////////////////////////////////////////////////////////////////////////////////////////
208212// / FlattenMap
209213// /////////////////////////////////////////////////////////////////////////////////////////////////
210- template <template <typename ...> class TMap , typename K, typename V, typename ... TParams>
211- auto FlattenMap (const Group& group, const State<TMap<K, State<V>, TParams ...>>& map) -> State<TMap<K, V>>
214+ template <template <typename ...> class TMap , template <typename > class TState , typename K, typename V, typename ... TParams,
215+ typename = std::enable_if_t <std::is_base_of_v<State<V>, TState<V>>>>
216+ auto FlattenMap (const Group& group, const State<TMap<K, TState<V>, TParams ...>>& map) -> State<TMap<K, V>>
212217{
213218 using REACT_IMPL::FlattenStateMapNode;
214219 using REACT_IMPL::SameGroupOrLink;
215220 using REACT_IMPL::CreateWrappedNode;
216221
217- return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, K, V, TParams ...>>(
222+ return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, TState, K, V, TParams ...>>(
218223 group, SameGroupOrLink (group, map));
219224}
220225
221- template <template <typename ...> class TMap , typename K, typename V, typename ... TParams>
222- auto FlattenMap (const State<TMap<K, State<V>, TParams ...>>& map) -> State<TMap<K, V>>
226+ template <template <typename ...> class TMap , template <typename > class TState , typename K, typename V, typename ... TParams,
227+ typename = std::enable_if_t <std::is_base_of_v<State<V>, TState<V>>>>
228+ auto FlattenMap (const State<TMap<K, TState<V>, TParams ...>>& map) -> State<TMap<K, V>>
223229 { return FlattenMap (map.GetGroup (), map); }
224230
225231// /////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments