:: NRequest m = NRequest String (m ()) Dynamic
//* Read a share with one rewrite step
-class read v :: (v m p r w) p -> PViewT m (ReadResult m p r w) | TC r & Monad m
+class read v :: (v m p r w) p -> PViewT m (ReadResult m p r w) | Monad m
//* Write a share with one rewrite step
-class write v :: (v m p r w) p w -> PViewT m (WriteResult m p r w) | TC w & Monad m
+class write v :: (v m p r w) p w -> PViewT m (WriteResult m p r w) | Monad m
+//* Observe a share and get notified when it happens
+class observe v
+where
+ identity :: (v m p r w) [String] -> [String]
+ observe :: (v m p r w) p String (m ()) -> PViewT m () | Monad m & TC p
//* Result of a single read rewrite
:: ReadResult m p r w
| LensWriteConst (p w -> m (? ws))
//* Box type, to get rid of a possible complex constructor of combinators
-:: SDS m p r w = E.sds: SDS (sds m p r w) (m ()) /*force kind*/ & read sds & write sds
-sds :: (sds m p r w) -> SDS m p r w | read sds & write sds & Monad m
+:: SDS m p r w = E.sds: SDS (sds m p r w) (m ()) /*force kind*/ & read, write, observe sds
+sds :: (sds m p r w) -> SDS m p r w | read, write, observe sds & Monad m
instance read SDS
instance write SDS
+instance observe SDS
//* Read a share completely
getShare :: (sds m () r w) -> PViewT m r | Monad m & read sds & TC r & TC w