4a5f0bafe503d5e92af958756121d71701b07880
[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
7 import ASDS.Source
8 import ASDS.Parallel
9 import ASDS.Select
10 import ASDS.Lens
11
12 //* Read a share with one rewrite step
13 class read v :: (v m p r w) p -> m (ReadResult m p r w) | TC r & Monad m
14 //* Write a share with one rewrite step
15 class write v :: (v m p r w) p w -> m (WriteResult m p r w) | TC w & Monad m
16
17 //* Result of a single read rewrite
18 :: ReadResult m p r w
19 = Read r //* done reading
20 | E.sds: Reading (sds m p r w) & read sds //* not done reading
21 | ReadResultUnused (m ())
22
23 //* Result of a single write rewrite
24 :: WriteResult m p r w
25 = Written () //* done writing
26 | E.sds: Writing (sds m p r w) & write sds //* not done writing
27 | WriteResultUnused (m ())
28
29 //* Read lens, it can choose to ignore the source
30 :: LensRead m p r rs
31 = LensRead (p rs -> m r)
32 | LensReadConst (p -> m r)
33
34 //* Write lens, it can choose to ignore the source, and thus not read it
35 :: LensWrite m p w rs ws
36 = LensWrite (p w rs -> m (? ws))
37 | LensWriteConst (p w -> m (? ws))
38
39 //* Box type, to get rid of a possible complex constructor of combinators
40 :: SDS m p r w = E.sds: SDS (sds m p r w) (m ()) /*force kind*/ & read sds & write sds
41 sds :: (sds m p r w) -> SDS m p r w | read sds & write sds & Monad m
42
43 instance read SDS
44 instance write SDS
45
46 //* Read a share completely
47 getShare :: (sds m () r w) -> m r | Monad m & read sds & TC r & TC w
48
49 //* Write a share completely
50 setShare :: w (sds m () r w) -> m () | Monad m & write sds & TC r & TC w
51
52 //* Update a share completely
53 updShare :: (r -> w) (sds m () r w) -> m w | Monad m & read sds & write sds & TC r & TC w