17 using SubscriptionId = uint32;
21 explicit State(T initial) : data(std::move(initial)) {}
23 std::map<SubscriptionId, Callback> callbacks;
24 SubscriptionId nextId{};
28 std::shared_ptr<State> state;
31 explicit Observable(T initial) : state(std::make_shared<State>(std::move(initial))) {}
33 Observable(Observable
const&) =
default;
34 Observable& operator=(Observable
const&) =
default;
35 Observable(Observable&&)
noexcept =
default;
36 Observable& operator=(Observable&&)
noexcept =
default;
38 [[nodiscard]] T getData()
const {
return state->data; }
40 void setData(T value) {
41 if (state->data == value) {
44 state->data = std::move(value);
46 for (
auto& [_, callback] : state->callbacks) {
47 callback(state->data);
51 SubscriptionId subscribe(Callback callback) {
56 auto const id = ++state->nextId;
57 state->callbacks.emplace(
id, std::move(callback));
61 bool unsubscribe(SubscriptionId
id) {
65 return state->callbacks.erase(
id) != 0;