uds
[clean-tests.git] / uds / param / ASDS / Parallel.dcl
1 definition module ASDS.Parallel
2
3 from ASDS import class read, class write, :: LensWrite, :: LensRead
4 from Control.Monad import class Monad
5 from Control.Applicative import class Applicative, class <*>, class pure
6 from Data.Functor import class Functor
7
8 //* Combine two shares in parallel
9 :: Par sdsl sdsr m p r w = E.p1 p2 r1 r2 w1 w2: Par (ParOpts sdsl sdsr m p1 p2 r1 r2 w1 w2 p r w) & TC r1 & TC r2 & TC w1 & TC w2 & TC p1 & TC p2
10 :: ParOpts sdsl sdsr m p1 p2 r1 r2 w1 w2 p r w =
11 { param :: p -> (p1, p2)
12 , readl :: r1 r2 -> r
13 , writel :: LensWrite m p w r1 w1
14 , writer :: LensWrite m p w r2 w2
15 , left :: sdsl m p1 r1 w1
16 , right :: sdsr m p2 r2 w2
17 }
18 par :: (p -> (p1, p2)) (r1 r2 -> r) (LensWrite m p w r1 w1) (LensWrite m p w r2 w2) (sdsl m p1 r1 w1) (sdsr m p2 r2 w2) -> Par sdsl sdsr m p r w | TC r1 & TC r2 & TC w1 & TC w2 & TC p1 & TC p2
19
20 instance read (Par sdsl sdsr) | read sdsl & read sdsr
21 instance write (Par sdsl sdsr) | read sdsl & read sdsr & write sdsl & write sdsr
22
23 //* Product of two shares
24 (>*<) infixl 6 :: (sdsl m p1 r1 w1) (sdsr m p2 r2 w2) -> Par sdsl sdsr m (p1, p2) (r1, r2) (w1, w2) | TC r1 & TC r2 & TC w1 & TC w2 & TC p1 & TC p2 & Monad m
25
26 //* Product of two shares that have the same the parameter
27 (>+<) infixl 6 :: (sdsl m p r1 w1) (sdsr m p r2 w2) -> Par sdsl sdsr m p (r1, r2) (w1, w2) | TC r1 & TC r2 & TC w1 & TC w2 & TC p & Monad m