From 546c0f2a7be61d9ef6fc067c92aaa05ce5156fae Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 28 Jul 2024 19:23:11 +0300 Subject: [PATCH] Support subscribing to react::value forever --- libs/react/include/psemek/react/value.hpp | 27 +++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/libs/react/include/psemek/react/value.hpp b/libs/react/include/psemek/react/value.hpp index ebda9491..884cbf6b 100644 --- a/libs/react/include/psemek/react/value.hpp +++ b/libs/react/include/psemek/react/value.hpp @@ -17,6 +17,9 @@ namespace psemek::react struct internal_tag {}; + struct forever_tag + {}; + template struct node { @@ -65,6 +68,8 @@ namespace psemek::react } + static constexpr detail::forever_tag forever; + template struct value { @@ -105,16 +110,16 @@ namespace psemek::react [[nodiscard]] auto subscribe(typename detail::node::external_subscriber subscriber, bool call = false) const { - if (call) - { - if constexpr (std::is_same_v) - subscriber(); - else - subscriber(node_->value()); - } + if (call) this->call(subscriber); return node_->external_signal.subscribe(std::move(subscriber)); } + void subscribe(typename detail::node::external_subscriber subscriber, detail::forever_tag, bool call = false) const + { + if (call) this->call(subscriber); + node_->external_signal.subscribe_forever(std::move(subscriber)); + } + [[nodiscard]] auto subscribe(detail::internal_tag, std::function subscriber) const { return node_->internal_signal.subscribe(std::move(subscriber)); @@ -122,6 +127,14 @@ namespace psemek::react protected: std::shared_ptr> node_; + + void call(typename detail::node::external_subscriber const & subscriber) const + { + if constexpr (std::is_same_v) + subscriber(); + else + subscriber(node_->value()); + } }; template