16 using SubscriptionId = std::uint32_t;
20 explicit State(T initial) : data(std::move(initial)) {}
22 std::map<SubscriptionId, Callback> callbacks;
23 SubscriptionId nextId{};
27 std::shared_ptr<State> state;
30 explicit Observable(T initial) : state(std::make_shared<State>(std::move(initial))) {}
32 Observable(Observable
const&) =
default;
33 Observable& operator=(Observable
const&) =
default;
34 Observable(Observable&&)
noexcept =
default;
35 Observable& operator=(Observable&&)
noexcept =
default;
37 [[nodiscard]] T getData()
const {
return state->data; }
39 void setData(T value) {
40 if (state->data == value) {
43 state->data = std::move(value);
45 for (
auto& [_, callback] : state->callbacks) {
46 callback(state->data);
50 SubscriptionId subscribe(Callback callback) {
55 auto const id = ++state->nextId;
56 state->callbacks.emplace(
id, std::move(callback));
60 bool unsubscribe(SubscriptionId
id) {
64 return state->callbacks.erase(
id) != 0;