//* Apply a lens to a share
:: Lens sds m p r w = E.p1 r1 w1: Lens (LensOpts sds m p1 r1 w1 p r w) & TC r1 & TC w1 & TC p1
-lens :: (p -> p1) (p r1 -> m r) (p w r1 -> m (Maybe w1)) (sds m p1 r1 w1) -> Lens sds m p r w | TC r1 & TC w1 & TC p1
+lens :: (p -> p1) (LensRead m p r r1) (LensWrite m p w r1 w1) (sds m p1 r1 w1) -> Lens sds m p r w | TC r1 & TC w1 & TC p1
:: LensOpts sds m p1 r1 w1 p r w =
{ param :: p -> p1
- , mapr :: p r1 -> m r
- , mapw :: p w r1 -> m (Maybe w1)
+ , mapr :: LensRead m p r r1
+ , mapw :: LensWrite m p w r1 w1
, lens :: sds m p1 r1 w1
}
+:: LensRead m p r rs
+ = LensRead (p rs -> m r)
+ | LensReadConst (p -> m r)
+:: LensWrite m p w rs ws
+ = LensWrite (p w rs -> m (Maybe ws))
+ | LensWriteConst (p w -> m (Maybe ws))
+
//* Determine a share from the value read from another share
:: Select sdsl sdsr m p r w = E.p1 r1 w1 p2: Select (SelectOpts sdsl sdsr m p1 r1 w1 p2 p r w) & TC r1 & TC p1 & TC p2
//select :: (sdsl m r1 w1) (r1 -> m (sdsr m r w)) -> Select sdsl sdsr m r w | TC r1 & TC w1 & Monad m