fd825378901ad218498b85688972bd1cee14bc81
[clean-tests.git] / uds / ASDS.dcl
1 definition module ASDS
2
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
7
8 import ASDS.Source
9 import ASDS.Parallel
10 import ASDS.Select
11 import ASDS.Lens
12
13 :: PViewT m a :== StateT [NRequest m] m a
14 :: NRequest m = NRequest String (m ()) Dynamic
15
16 //* Read a share with one rewrite step
17 class read v :: (v m p r w) p -> PViewT m (ReadResult m p r w) | Monad m
18 //* Write a share with one rewrite step
19 class write v :: (v m p r w) p w -> PViewT m (WriteResult m p r w) | Monad m
20 //* Observe a share and get notified when it happens
21 class observe v
22 where
23 identity :: (v m p r w) [String] -> [String]
24 observe :: (v m p r w) p String (m ()) -> PViewT m () | Monad m & TC p
25
26 //* Result of a single read rewrite
27 :: ReadResult m p r w
28 = Read r //* done reading
29 | E.sds: Reading (sds m p r w) & read sds //* not done reading
30 | ReadResultUnused (m ())
31
32 //* Result of a single write rewrite
33 :: WriteResult m p r w
34 = Written () //* done writing
35 | E.sds: Writing (sds m p r w) & write sds //* not done writing
36 | WriteResultUnused (m ())
37
38 //* Read lens, it can choose to ignore the source
39 :: LensRead m p r rs
40 = LensRead (p rs -> m r)
41 | LensReadConst (p -> m r)
42
43 //* Write lens, it can choose to ignore the source, and thus not read it
44 :: LensWrite m p w rs ws
45 = LensWrite (p w rs -> m (? ws))
46 | LensWriteConst (p w -> m (? ws))
47
48 //* Box type, to get rid of a possible complex constructor of combinators
49 :: SDS m p r w = E.sds: SDS (sds m p r w) (m ()) /*force kind*/ & read, write, observe sds
50 sds :: (sds m p r w) -> SDS m p r w | read, write, observe sds & Monad m
51
52 instance read SDS
53 instance write SDS
54 instance observe SDS
55
56 //* Read a share completely
57 getShare :: (sds m () r w) -> PViewT m r | Monad m & read sds & TC r & TC w
58
59 //* Write a share completely
60 setShare :: w (sds m () r w) -> PViewT m () | Monad m & write sds & TC r & TC w
61
62 //* Update a share completely
63 updShare :: (r -> w) (sds m () r w) -> PViewT m w | Monad m & read sds & write sds & TC r & TC w