From a511d2d1ef5fa07dde601961fe9394b474aad5ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 24 Apr 2021 21:20:25 +0200 Subject: Behavior lens for shared refs from local state --- include/erebos/frp.h | 28 +++++++++++++++++++++++++++- include/erebos/state.h | 2 ++ include/erebos/storage.h | 4 ++-- include/erebos/sync.h | 8 +++++--- 4 files changed, 36 insertions(+), 6 deletions(-) (limited to 'include/erebos') diff --git a/include/erebos/frp.h b/include/erebos/frp.h index 587d2b6..b60b29f 100644 --- a/include/erebos/frp.h +++ b/include/erebos/frp.h @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -115,6 +114,8 @@ public: return impl->get(ctime, x); } + template BhvFun lens() const; + const shared_ptr> impl; }; @@ -135,6 +136,8 @@ public: } Watched watch(function); + template BhvFun lens() const; + const shared_ptr> impl; }; @@ -227,4 +230,27 @@ BhvFun operator>>(const BhvFun & f, const BhvFun & g) return impl; } + +template +class BhvLens : public BhvImpl +{ +public: + B get(const BhvCurTime &, const A & x) const override + { return A::template lens(x); } +}; + +template +template +BhvFun BhvFun::lens() const +{ + return *this >> BhvFun(make_shared>()); +} + +template +template +BhvFun BhvFun::lens() const +{ + return *this >> BhvFun(make_shared>()); +} + } diff --git a/include/erebos/state.h b/include/erebos/state.h index b1567b0..7060f22 100644 --- a/include/erebos/state.h +++ b/include/erebos/state.h @@ -32,6 +32,8 @@ public: vector sharedRefs() const; LocalState sharedRefAdd(const Ref &) const; + template static T lens(const LocalState &); + private: vector lookupShared(UUID) const; LocalState updateShared(UUID, const vector &) const; diff --git a/include/erebos/storage.h b/include/erebos/storage.h index 2d00cc3..9d28ec7 100644 --- a/include/erebos/storage.h +++ b/include/erebos/storage.h @@ -182,8 +182,8 @@ public: Ref & operator=(const Ref &) = default; Ref & operator=(Ref &&) = default; - bool operator==(const Ref &) = delete; - bool operator!=(const Ref &) = delete; + bool operator==(const Ref &) const; + bool operator!=(const Ref &) const; static std::optional create(const Storage &, const Digest &); static Ref zcreate(const Storage &); diff --git a/include/erebos/sync.h b/include/erebos/sync.h index 0b9ed9a..dad4e0e 100644 --- a/include/erebos/sync.h +++ b/include/erebos/sync.h @@ -6,9 +6,12 @@ #include #include +#include namespace erebos { +using std::vector; + class SyncService : public Service { public: @@ -22,11 +25,10 @@ public: private: void peerWatcher(size_t, const class Peer *); - void localStateWatcher(const Head &); + void localStateWatcher(const vector &); const class Server * server; - std::mutex headMutex; - std::optional> watchedHead; + std::optional>> watchedLocal; }; } -- cgit v1.2.3