3 from Data.Functor import class Functor
4 from Control.Applicative import class Applicative, class <*>, class pure
5 from Control.Monad import class Monad
6 from Control.Monad.State import :: StateT
13 :: PViewT m a = PViewT (StateT [NRequest m] m a) (m ())
14 :: NRequest m = NRequest String (m ())
16 //* Read a share with one rewrite step
17 class read v :: (v m p r w) p -> m (ReadResult m p r w) | TC r & Monad m
18 //* Write a share with one rewrite step
19 class write v :: (v m p r w) p w -> m (WriteResult m p r w) | TC w & Monad m
21 //* Result of a single read rewrite
23 = Read r //* done reading
24 | E.sds: Reading (sds m p r w) & read sds //* not done reading
25 | ReadResultUnused (m ())
27 //* Result of a single write rewrite
28 :: WriteResult m p r w
29 = Written () //* done writing
30 | E.sds: Writing (sds m p r w) & write sds //* not done writing
31 | WriteResultUnused (m ())
33 //* Read lens, it can choose to ignore the source
35 = LensRead (p rs -> m r)
36 | LensReadConst (p -> m r)
38 //* Write lens, it can choose to ignore the source, and thus not read it
39 :: LensWrite m p w rs ws
40 = LensWrite (p w rs -> m (? ws))
41 | LensWriteConst (p w -> m (? ws))
43 //* Box type, to get rid of a possible complex constructor of combinators
44 :: SDS m p r w = E.sds: SDS (sds m p r w) (m ()) /*force kind*/ & read sds & write sds
45 sds :: (sds m p r w) -> SDS m p r w | read sds & write sds & Monad m
50 //* Read a share completely
51 getShare :: (sds m () r w) -> m r | Monad m & read sds & TC r & TC w
53 //* Write a share completely
54 setShare :: w (sds m () r w) -> m () | Monad m & write sds & TC r & TC w
56 //* Update a share completely
57 updShare :: (r -> w) (sds m () r w) -> m w | Monad m & read sds & write sds & TC r & TC w