7d4c7cb8da46464cfaa900171dc2fed80e78beb1
[folly.git] / folly / experimental / wangle / rx / Subject.h
1 /*
2  * Copyright 2014 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #pragma once
18 #include "Observable.h"
19 #include "Observer.h"
20
21 namespace folly { namespace wangle {
22
23 /// Subject interface. A Subject is both an Observable and an Observer. There
24 /// is a default implementation of the Observer methods that just forwards the
25 /// observed events to the Subject's observers.
26 template <class T>
27 struct Subject : public Observable<T>, public Observer<T> {
28   typedef typename Observable<T>::ObserversGuard ObserversGuard;
29   void onNext(T val) override {
30     ObserversGuard guard(this);
31     for (auto& o : Observable<T>::getObservers()) {
32       o->onNext(val);
33     }
34   }
35   void onError(Error e) override {
36     ObserversGuard guard(this);
37     for (auto& o : Observable<T>::getObservers()) {
38       o->onError(e);
39     }
40   }
41   void onCompleted() override {
42     ObserversGuard guard(this);
43     for (auto& o : Observable<T>::getObservers()) {
44       o->onCompleted();
45     }
46   }
47 };
48
49 }}