packages feed

monoidmap-0.0.1.2: src/examples/Examples/MultiMap/Instances/MultiMap1.hs

-- |
-- Copyright: © 2022–2024 Jonathan Knowles
-- License: Apache-2.0
--
-- An __unlawful__ implementation of 'MultiMap', implemented in terms of 'Map'
-- and 'Set'.
--
-- This implementation has several subtle bugs. 💥
--
module Examples.MultiMap.Instances.MultiMap1 where

import Prelude

import Data.Map.Strict
    ( Map )
import Data.Set
    ( Set )

import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Examples.MultiMap.Class as Class

newtype MultiMap1 k v = MultiMap (Map k (Set v))
    deriving stock (Eq, Show)

instance (Ord k, Ord v) => Class.MultiMap MultiMap1 k v where

    fromList = MultiMap . Map.fromList

    toList (MultiMap m) = Map.toList m

    empty = MultiMap Map.empty

    lookup k (MultiMap m) = Map.findWithDefault Set.empty k m

    null (MultiMap m) = Map.null m

    nonNull (MultiMap m) = not (Map.null m)

    nonNullKey k (MultiMap m) = Map.member k m

    nonNullKeys (MultiMap m) = Map.keysSet m

    nonNullCount (MultiMap m) = Map.size m

    isSubmapOf (MultiMap m1) (MultiMap m2) =
        Map.isSubmapOfBy Set.isSubsetOf m1 m2

    update k vs (MultiMap m) = MultiMap (Map.insert k vs m)

    insert k vs (MultiMap m) = MultiMap $
        Map.insert k (Map.findWithDefault Set.empty k m `Set.union` vs) m

    remove k vs (MultiMap m) = MultiMap $
        Map.insert k (Map.findWithDefault Set.empty k m `Set.difference` vs) m

    union (MultiMap m1) (MultiMap m2) = MultiMap $
        Map.unionWith Set.union m1 m2

    intersection (MultiMap m1) (MultiMap m2) = MultiMap $
        Map.intersectionWith Set.intersection m1 m2