]> Git — Sourcephile - majurity.git/blob - hjugement-protocol/src/Voting/Protocol/Utils.hs
protocol: add preliminary support for trustees
[majurity.git] / hjugement-protocol / src / Voting / Protocol / Utils.hs
1 module Voting.Protocol.Utils where
2
3 import Control.Applicative (Applicative(..))
4 import Data.Bool
5 import Data.Eq (Eq(..))
6 import Data.Foldable (sequenceA_)
7 import Data.Function (($))
8 import Data.Functor ((<$))
9 import Data.Maybe (Maybe(..), maybe)
10 import Data.Traversable (Traversable(..))
11 import qualified Data.List as List
12
13 -- | NOTE: check the lengths before applying @f@.
14 isoZipWith :: (a->b->c) -> [a]->[b]->Maybe [c]
15 isoZipWith f as bs
16 | List.length as /= List.length bs = Nothing
17 | otherwise = Just (List.zipWith f as bs)
18
19 -- | NOTE: check the lengths before applying @f@.
20 isoZipWith3 :: (a->b->c->d) -> [a]->[b]->[c]->Maybe [d]
21 isoZipWith3 f as bs cs
22 | al /= List.length bs = Nothing
23 | al /= List.length cs = Nothing
24 | otherwise = Just (List.zipWith3 f as bs cs)
25 where al = List.length as
26
27 isoZipWithM ::
28 Applicative m =>
29 m () ->
30 (a -> b -> m c) ->
31 [a] -> [b] -> m [c]
32 isoZipWithM err f as bs =
33 maybe ([] <$ err) sequenceA $
34 isoZipWith f as bs
35
36 isoZipWithM_ ::
37 Applicative m =>
38 m () ->
39 (a -> b -> m c) ->
40 [a] -> [b] -> m ()
41 isoZipWithM_ err f as bs =
42 maybe err sequenceA_ $
43 isoZipWith f as bs
44
45 isoZipWith3M ::
46 Applicative m =>
47 m () ->
48 (a -> b -> c -> m d) ->
49 [a] -> [b] -> [c] -> m [d]
50 isoZipWith3M err f as bs cs =
51 maybe ([] <$ err) sequenceA $
52 isoZipWith3 f as bs cs
53
54 isoZipWith3M_ ::
55 Applicative m =>
56 m () ->
57 (a -> b -> c -> m d) ->
58 [a] -> [b] -> [c] ->
59 m ()
60 isoZipWith3M_ err f as bs cs =
61 maybe err sequenceA_ $
62 isoZipWith3 f as bs cs
63