module Copilot.Library.Voting
( majority, aMajority ) where
import Copilot.Language
import Copilot.Language.Prelude
import qualified Prelude as P
majority :: (P.Eq a, Typed a) => [Stream a] -> Stream a
majority [] = badUsage "majority: empty list not allowed"
majority (x:xs) = majority' xs x 1
majority' :: (P.Eq a, Typed a)
=> [Stream a] -> Stream a -> Stream Word32 -> Stream a
majority' [] can _ = can
majority' (x:xs) can cnt =
local (cnt == 0) $ \ zero ->
local (if zero then x else can) $ \ can' ->
local (if zero || x == can then cnt+1 else cnt1) $ \ cnt' ->
majority' xs can' cnt'
aMajority :: (P.Eq a, Typed a) => [Stream a] -> Stream a -> Stream Bool
aMajority [] _ = badUsage "aMajority: empty list not allowed"
aMajority xs can =
let
cnt = aMajority' 0 xs can
in
(cnt * 2) > fromIntegral (length xs)
aMajority' :: (P.Eq a, Typed a)
=> Stream Word32 -> [Stream a] -> Stream a -> Stream Word32
aMajority' cnt [] _ = cnt
aMajority' cnt (x:xs) can =
local (if x == can then cnt+1 else cnt) $ \ cnt' ->
aMajority' cnt' xs can