bricks-internal-0.0.0.4: src/Bricks/Internal/Map.hs
module Bricks.Internal.Map
( module Data.Map
, exactKeys
, restrictKeys
) where
-- Containers
import Data.Map hiding (restrictKeys)
import Data.Set (Set)
import qualified Data.Set as Set
{- | This function was added in containers version 0.5.8 which we're not using
yet. -}
restrictKeys :: Ord k => Map k a -> Set k -> Map k a
m `restrictKeys` s = filterWithKey (\k _ -> k `Set.member` s) m
{- | If @s@ is a subset of the keys in @m@ then
> m exactKeys s = Right (m `restrictKeys` s)
Otherwise, @m exactKeys s = Left s'@ where @s'@ is the keys that are missing
from @m@. -}
-- | ==== Examples
--
-- >>> :{
-- >>> fromList [('a', 1), ('b', 2), ('c', 3)]
-- >>> `exactKeys` Set.fromList ['a', 'b']
-- >>> :}
-- Right (fromList [('a',1),('b',2)])
--
-- >>> :{
-- >>> fromList [('a', 1), ('b', 2), ('c', 3)]
-- >>> `exactKeys` Set.fromList ['a', 'x', 'y']
-- >>> :}
-- Left (fromList "xy")
exactKeys :: Ord k => Map k a -> Set k -> Either (Set k) (Map k a)
m `exactKeys` s =
let
s' = s `Set.difference` keysSet m
in
if Set.null s'
then Right (m `restrictKeys` s)
else Left s'