updates, hierarchical
[clean-tests.git] / uds / ASDS / Lens.dcl
1 definition module ASDS.Lens
2
3 from ASDS import class read, class write, :: LensWrite, :: LensRead
4
5 from StdOverloaded import class <
6 from StdClass import class Eq
7 from Control.Monad import class Monad
8 from Control.Monad.Fail import class MonadFail
9 from Control.Applicative import class Applicative, class <*>, class pure
10 from Data.Functor import class Functor
11 from Data.Map import :: Map
12
13 //* Apply a lens to a share
14 :: 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
15 :: LensOpts sds m p1 r1 w1 p r w =
16 { param :: p -> p1
17 , mapr :: LensRead m p r r1
18 , mapw :: LensWrite m p w r1 w1
19 , lens :: sds m p1 r1 w1
20 }
21 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
22
23 instance read (Lens sds) | read sds
24 instance write (Lens sds) | read sds & write sds
25
26 //* Map a function to the value read
27 mapRead :: (r -> m r`) (sds m p r w) -> Lens sds m p r` w | TC r` & TC r & TC w & TC p & Monad m
28 (>?@) infixl 6
29 (>?@) :== mapRead
30
31 //* Map a function to the value written.
32 mapWrite :: (w` r -> m (? w)) (sds m p r w) -> Lens sds m p r w` | TC r & TC w & TC w` & TC p & Monad m
33 (>!@) infixl 6
34 (>!@) :== mapWrite
35
36 //* Translate the parameter space
37 translate :: (p -> ps) (sds m ps r w) -> Lens sds m p r w | TC r & TC w & TC p & TC ps & Monad m
38
39 //* focus a parameter: @type :: p (sds m p r w) -> (sds m p` r w)
40 focus p :== translate \_->p
41
42 //* Deserialize from a dynamic store
43 fromDynStore :: (sds m p Dynamic Dynamic) -> Lens sds m p r w | TC r & TC w & TC p & MonadFail m
44
45 //* Serialize to a dynamic store
46 toDynStore :: (sds m p r w) -> Lens sds m p Dynamic Dynamic | TC r & TC w & TC p & MonadFail m
47
48 //* Focus on a single element in a list
49 indexedStore :: (sds m p [a] [a]) -> Lens sds m (p, Int) a a | TC a & TC p & MonadFail m
50
51 //* Focus on a single element in an associative list
52 assocStore :: (sds m p [(k, v)] [(k, v)]) -> Lens sds m (p, k) v v | TC v & TC k & Eq k & TC p & MonadFail m
53
54 //* Focus on a value in a map
55 keyedStore :: (sds m p (Map k v) (Map k v)) -> Lens sds m (p, k) v v | TC v & TC k & < k & TC p & MonadFail m