@@ -169,6 +169,90 @@ template <typename S, typename E>
169169auto Pulse (const State<S>& state, const Event<E>& evnt) -> Event<S>
170170 { return Pulse (state.GetGroup (), state, evnt); }
171171
172+ // /////////////////////////////////////////////////////////////////////////////////////////////////
173+ // / Flatten
174+ // /////////////////////////////////////////////////////////////////////////////////////////////////
175+ template <typename S>
176+ auto Flatten (const Group& group, const State<State<S>>& state) -> State<S>
177+ {
178+ using REACT_IMPL::FlattenStateNode;
179+ using REACT_IMPL::SameGroupOrLink;
180+ using REACT_IMPL::CreateWrappedNode;
181+
182+ return CreateWrappedNode<State<S>, FlattenStateNode<S>>(group, SameGroupOrLink (group, state));
183+ }
184+
185+ template <typename S>
186+ auto Flatten (const State<State<S>>& state) -> State<S>
187+ { return Flatten (state.GetGroup (), state); }
188+
189+ // /////////////////////////////////////////////////////////////////////////////////////////////////
190+ // / FlattenList
191+ // /////////////////////////////////////////////////////////////////////////////////////////////////
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+ {
195+ using REACT_IMPL::FlattenStateListNode;
196+ using REACT_IMPL::SameGroupOrLink;
197+ using REACT_IMPL::CreateWrappedNode;
198+
199+ return CreateWrappedNode<State<TList<V>>, FlattenStateListNode<TList, V, TParams ...>>(
200+ group, SameGroupOrLink (group, list));
201+ }
202+
203+ template <template <typename ...> class TList , typename V, typename ... TParams>
204+ auto FlattenList (const State<TList<State<V>, TParams ...>>& list) -> State<TList<V>>
205+ { return FlattenList (list.GetGroup (), list); }
206+
207+ // /////////////////////////////////////////////////////////////////////////////////////////////////
208+ // / FlattenMap
209+ // /////////////////////////////////////////////////////////////////////////////////////////////////
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>>
212+ {
213+ using REACT_IMPL::FlattenStateMapNode;
214+ using REACT_IMPL::SameGroupOrLink;
215+ using REACT_IMPL::CreateWrappedNode;
216+
217+ return CreateWrappedNode<State<TMap<K, V>>, FlattenStateMapNode<TMap, K, V, TParams ...>>(
218+ group, SameGroupOrLink (group, map));
219+ }
220+
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>>
223+ { return FlattenMap (map.GetGroup (), map); }
224+
225+ // /////////////////////////////////////////////////////////////////////////////////////////////////
226+ // / FlattenObject
227+ // /////////////////////////////////////////////////////////////////////////////////////////////////
228+ template <typename T, typename TFlat = typename T::Flat>
229+ auto FlattenObject (const Group& group, const State<T>& obj) -> State<TFlat>
230+ {
231+ using REACT_IMPL::FlattenObjectNode;
232+ using REACT_IMPL::SameGroupOrLink;
233+ using REACT_IMPL::CreateWrappedNode;
234+
235+ return CreateWrappedNode<State<TFlat>, FlattenObjectNode<T, TFlat>>(group, obj);
236+ }
237+
238+ template <typename T, typename TFlat = typename T::Flat>
239+ auto FlattenObject (const State<T>& obj) -> State<TFlat>
240+ { return FlattenObject (obj.GetGroup (), obj); }
241+
242+ template <typename T, typename TFlat = typename T::Flat>
243+ auto FlattenObject (const Group& group, const State<Ref<T>>& obj) -> State<TFlat>
244+ {
245+ using REACT_IMPL::FlattenObjectNode;
246+ using REACT_IMPL::SameGroupOrLink;
247+ using REACT_IMPL::CreateWrappedNode;
248+
249+ return CreateWrappedNode<State<TFlat>, FlattenObjectNode<Ref<T>, TFlat>>(group, obj);
250+ }
251+
252+ template <typename T, typename TFlat = typename T::Flat>
253+ auto FlattenObject (const State<Ref<T>>& obj) -> State<TFlat>
254+ { return FlattenObject (obj.GetGroup (), obj); }
255+
172256/* *****************************************/ REACT_END /* *****************************************/
173257
174258#endif // REACT_ALGORITHM_H_INCLUDED
0 commit comments