feat(participants): basic funktions added

This commit is contained in:
ros 2021-05-21 16:55:02 +02:00
parent a4bd1159c2
commit b96327b18d
2 changed files with 40 additions and 7 deletions

View File

@ -1,4 +1,4 @@
{-# OPTIONS_GHC -fno-warn-redundant-constraints -fno-warn-incomplete-uni-patterns #-} {-# OPTIONS_GHC -fno-warn-redundant-constraints -fno-warn-incomplete-uni-patterns -Wno-error=deprecations #-}
module Handler.Participants module Handler.Participants
( getParticipantsListR ( getParticipantsListR
, getParticipantsR , getParticipantsR
@ -110,7 +110,8 @@ postParticipantsIntersectR = do
-> Set.size $ Map.findWithDefault Set.empty lCid courseUsers `Set.intersection` Map.findWithDefault Set.empty uCid courseUsers -> Set.size $ Map.findWithDefault Set.empty lCid courseUsers `Set.intersection` Map.findWithDefault Set.empty uCid courseUsers
selfIntersections = Map.mapKeysMonotonic (\cid -> (cid, cid)) $ Set.size <$> courseUsers selfIntersections = Map.mapKeysMonotonic (\cid -> (cid, cid)) $ Set.size <$> courseUsers
intersections' = Map.union intersections selfIntersections intersections' = Map.union intersections selfIntersections
let allUsers = setIntersectAll $ Map.elems courseUsers
let mapIntersect = mapIntersectNotOne courseUsers
return (courses, intersections') return (courses, intersections')
let let

View File

@ -7,32 +7,64 @@ module Utils.Set
, setProduct , setProduct
, setPartitionEithers , setPartitionEithers
, setFromFunc , setFromFunc
, mapIntersectNotOne
, getAllUserIdsSetList
) where ) where
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Map.Strict() import qualified Data.Map.Strict()
import qualified Data.Map as Map
import ClassyPrelude import ClassyPrelude
import Data.Universe import Data.Universe
import Control.Lens.Prism import Control.Lens.Prism
import Control.Lens import Control.Lens
-- Mächtigkeit Schnittmenge -- | cardinal number of a Set
setIntersectAll :: Ord a => [Set.Set a] -> Int setIntersectAll :: Ord a => [Set.Set a] -> Int
setIntersectAll [] = 0 setIntersectAll [] = 0
setIntersectAll [x] = Set.size x setIntersectAll [x] = Set.size x
setIntersectAll (x:y:z) = setIntersectAll (xy:z) where xy = Set.intersection x y setIntersectAll (x:y:z) = setIntersectAll (xy:z) where xy = Set.union x y
-- Mächtigkeit Schnittmenge Set, Liste von Sets -- | cardinal number of an intersection of a set and a list of sets
setIntersectNotOne :: Ord a => Set.Set a -> [Set.Set a] -> Int setIntersectNotOne :: Ord a => Set.Set a -> [Set.Set a] -> Int
setIntersectNotOne _ [] = 0 setIntersectNotOne _ [] = 0
setIntersectNotOne k r = Set.size $ Set.intersection k others where others = setUnionOthers r setIntersectNotOne k r = Set.size $ Set.intersection k others where others = setUnionOthers r
-- Vereinigung von Sets -- | Union of a list of sets
setUnionOthers :: Ord a => [Set.Set a] -> Set.Set a setUnionOthers :: Ord a => [Set.Set a] -> Set.Set a
setUnionOthers [] = Set.empty setUnionOthers [] = Set.empty
setUnionOthers [x] = x setUnionOthers [x] = x
setUnionOthers (x:y:z) = setUnionOthers (xy:z) where xy = Set.union x y setUnionOthers (x:y:z) = setUnionOthers (xy:z) where xy = Set.union x y
-- Fkt für Tabelle
-- | list of values of a Map with Sets as values
getAllUserIdsSetList :: Map.Map a (Set b) -> [Set b]
getAllUserIdsSetList m = loop (Map.toList m) [] where
loop [] uids = uids
loop ((_,v):xs) uids = loop xs $ uids ++ [v]
-- | value of a Map with given key
getUserIdsOfOneCourse :: (Ord a, Ord b) => Map.Map a (Set b) -> a -> Set b
getUserIdsOfOneCourse m cid
|m == Map.empty = Set.empty
|otherwise = m Map.! cid
-- | extracts from a map a list of values (sets) without one specific entry (a)
getAllUserIdsWithoutOne :: (Ord a, Ord b) => Map.Map a (Set b) -> a -> [Set b]
getAllUserIdsWithoutOne m cid
|m == Map.empty = []
|otherwise = getAllUserIdsSetList $ Map.delete cid m
-- | transforms values (sets) of a map to integers. The number gives information about how many entreis are not only in this one
mapIntersectNotOne :: (Ord a, Ord b) => Map.Map a (Set b) -> Map.Map a Int
mapIntersectNotOne m = loop (Map.toList m) Map.empty where
loop [] ino = ino
loop ((k,_):xs) ino = loop xs $ Map.insert k (setIntersectNotOne (getUserIdsOfOneCourse m k) (getAllUserIdsWithoutOne m k)) ino
-----------------------------
-- Functions from Utils.hs --
-----------------------------
-- | Intersection of multiple sets. Returns empty set for empty input list -- | Intersection of multiple sets. Returns empty set for empty input list
setIntersections :: Ord a => [Set a] -> Set a setIntersections :: Ord a => [Set a] -> Set a
setIntersections [] = Set.empty setIntersections [] = Set.empty