From 2da96c54823d14b22f16f11d9963065913807312 Mon Sep 17 00:00:00 2001
From: Michael Sippel <micha@fragmental.art>
Date: Mon, 7 Dec 2020 18:28:28 +0100
Subject: [PATCH] add impls for Arc<dyn View> and Arc<dyn Observer>

---
 src/main.rs |  2 +-
 src/view.rs | 95 ++++++++++++++++++++++++++++++++---------------------
 2 files changed, 58 insertions(+), 39 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 4ab047f..76fccbb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -59,7 +59,7 @@ async fn main() {
 
     let view = view_port.outer().get_view();
     let mut stream = view_port.outer().stream().map({
-        move |_| view.read().unwrap().as_ref().unwrap().view(()).unwrap()
+        move |_| view.view(()).unwrap()
     });
 
     let fut = task::spawn({
diff --git a/src/view.rs b/src/view.rs
index 75ad91d..6b804c8 100644
--- a/src/view.rs
+++ b/src/view.rs
@@ -95,6 +95,63 @@ where T: Send + Sync,
 
 //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
 
+use std::ops::Deref;
+use std::sync::{Arc, RwLock};
+
+impl<T: View> View for RwLock<T> {
+    type Key = T::Key;
+    type Value = T::Value;
+
+    fn view(&self, key: T::Key) -> Option<T::Value> {
+        self.read().unwrap().view(key)
+    }
+}
+
+impl<T: Observer> Observer for RwLock<T> {
+    type Msg = T::Msg;
+
+    fn notify(&self, msg: T::Msg) {
+        self.read().unwrap().notify(msg)
+    }
+}
+
+impl<T: View> View for Arc<T> {
+    type Key = T::Key;
+    type Value = T::Value;
+
+    fn view(&self, key: T::Key) -> Option<T::Value> {
+        self.deref().view(key)
+    }
+}
+
+impl<T: Observer> Observer for Arc<T> {
+    type Msg = T::Msg;
+
+    fn notify(&self, msg: T::Msg) {
+        self.deref().notify(msg)
+    }
+}
+
+impl<K, V> View for Arc<dyn View<Key = K, Value = V>>
+where K: Send + Sync,
+      V: Send + Sync {
+    type Key = K;
+    type Value = V;
+
+    fn view(&self, key: K) -> Option<V> {
+        self.deref().view(key)
+    }
+}
+
+impl<T> Observer for Arc<dyn Observer<Msg = T>>
+where T:  Send + Sync {
+    type Msg = T;
+
+    fn notify(&self, msg: T) {
+        self.deref().notify(msg)
+    }
+}
+
 impl<T: View> View for Option<T> {
     type Key = T::Key;
     type Value = T::Value;
@@ -118,41 +175,3 @@ impl<T: Observer> Observer for Option<T> {
     }
 }
 
-//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
-
-impl<T: View> View for std::sync::RwLock<T> {
-    type Key = T::Key;
-    type Value = T::Value;
-
-    fn view(&self, key: T::Key) -> Option<T::Value> {
-        self.read().unwrap().view(key)
-    }
-}
-
-impl<T: Observer> Observer for std::sync::RwLock<T> {
-    type Msg = T::Msg;
-
-    fn notify(&self, msg: T::Msg) {
-        self.read().unwrap().notify(msg)
-    }
-}
-
-use std::ops::Deref;
-
-impl<T: View> View for std::sync::Arc<T> {
-    type Key = T::Key;
-    type Value = T::Value;
-
-    fn view(&self, key: T::Key) -> Option<T::Value> {
-        self.deref().view(key)
-    }
-}
-
-impl<T: Observer> Observer for std::sync::Arc<T> {
-    type Msg = T::Msg;
-
-    fn notify(&self, msg: T::Msg) {
-        self.deref().notify(msg)
-    }
-}
-