@@ -11,28 +11,30 @@ namespace react {
1111template <typename T>
1212class Reactive ;
1313
14- template <typename D, typename TValue >
14+ template <typename D, typename S >
1515class RSignal ;
1616
17- template <typename D, typename TValue >
17+ template <typename D, typename E >
1818class REvents ;
1919
20+ enum class EventToken ;
21+
2022// //////////////////////////////////////////////////////////////////////////////////////
21- // / Observer_
23+ // / RObserver
2224// //////////////////////////////////////////////////////////////////////////////////////
2325template <typename D>
24- class Observer_
26+ class RObserver
2527{
2628public:
2729 typedef NodeBase<D> SubjectT;
2830
29- Observer_ () :
31+ RObserver () :
3032 ptr_{ nullptr },
3133 subject_{ nullptr }
3234 {
3335 }
3436
35- Observer_ (ObserverNode<D>* ptr, const std::shared_ptr<SubjectT>& subject) :
37+ RObserver (ObserverNode<D>* ptr, const std::shared_ptr<SubjectT>& subject) :
3638 ptr_{ ptr },
3739 subject_{ subject }
3840 {
@@ -136,7 +138,7 @@ template
136138 typename TArg
137139>
138140inline auto Observe (const RSignal<D,TArg>& subject, const TFunc& func)
139- -> Observer_ <D>
141+ -> RObserver <D>
140142{
141143 std::unique_ptr<ObserverNode<D>> pUnique (
142144 new SignalObserverNode<D,TArg>(subject.GetPtr (), func, false ));
@@ -145,17 +147,19 @@ inline auto Observe(const RSignal<D,TArg>& subject, const TFunc& func)
145147
146148 D::Observers ().Register (std::move (pUnique), subject.GetPtr ().get ());
147149
148- return Observer_ <D>(raw, subject.GetPtr ());
150+ return RObserver <D>(raw, subject.GetPtr ());
149151}
150152
151153template
152154<
153155 typename D,
154156 typename TFunc,
155- typename TArg
157+ typename TArg,
158+ typename = std::enable_if<
159+ ! std::is_same<TArg,EventToken>::value>::type
156160>
157161inline auto Observe (const REvents<D,TArg>& subject, const TFunc& func)
158- -> Observer_ <D>
162+ -> RObserver <D>
159163{
160164 std::unique_ptr<ObserverNode<D>> pUnique (
161165 new EventObserverNode<D,TArg>(subject.GetPtr (), func, false ));
@@ -164,7 +168,26 @@ inline auto Observe(const REvents<D,TArg>& subject, const TFunc& func)
164168
165169 D::Observers ().Register (std::move (pUnique), subject.GetPtr ().get ());
166170
167- return Observer_<D>(raw, subject.GetPtr ());
171+ return RObserver<D>(raw, subject.GetPtr ());
172+ }
173+
174+ template
175+ <
176+ typename D,
177+ typename TFunc
178+ >
179+ inline auto Observe (const REvents<D,EventToken>& subject, const TFunc& func)
180+ -> RObserver<D>
181+ {
182+ std::unique_ptr<ObserverNode<D>> pUnique (
183+ new EventObserverNode<D,EventToken>(
184+ subject.GetPtr (), [func] (EventToken _) { func (); }, false ));
185+
186+ auto * raw = pUnique.get ();
187+
188+ D::Observers ().Register (std::move (pUnique), subject.GetPtr ().get ());
189+
190+ return RObserver<D>(raw, subject.GetPtr ());
168191}
169192
170193// //////////////////////////////////////////////////////////////////////////////////////
0 commit comments