{-# LANGUAGE Safe #-}
module Data.Map.Utils (
flipM, flippedLookupM, forceLookupM,
strToM,
strFromM
)
where
import Data.List.Utils (flipAL, strFromAL, strToAL)
import qualified Data.Map
strFromM :: (Show a, Show b, Ord a) => Data.Map.Map a b -> String
strFromM :: Map a b -> String
strFromM = [(a, b)] -> String
forall a b. (Show a, Show b) => [(a, b)] -> String
strFromAL ([(a, b)] -> String) -> (Map a b -> [(a, b)]) -> Map a b -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map a b -> [(a, b)]
forall k a. Map k a -> [(k, a)]
Data.Map.toList
strToM :: (Read a, Read b, Ord a) => String -> Data.Map.Map a b
strToM :: String -> Map a b
strToM = [(a, b)] -> Map a b
forall k a. Ord k => [(k, a)] -> Map k a
Data.Map.fromList ([(a, b)] -> Map a b) -> (String -> [(a, b)]) -> String -> Map a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(a, b)]
forall a b. (Read a, Read b) => String -> [(a, b)]
strToAL
flipM :: (Ord key, Ord val) => Data.Map.Map key val -> Data.Map.Map val [key]
flipM :: Map key val -> Map val [key]
flipM = [(val, [key])] -> Map val [key]
forall k a. Ord k => [(k, a)] -> Map k a
Data.Map.fromList ([(val, [key])] -> Map val [key])
-> (Map key val -> [(val, [key])]) -> Map key val -> Map val [key]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(key, val)] -> [(val, [key])]
forall key val. (Eq key, Eq val) => [(key, val)] -> [(val, [key])]
flipAL ([(key, val)] -> [(val, [key])])
-> (Map key val -> [(key, val)]) -> Map key val -> [(val, [key])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map key val -> [(key, val)]
forall k a. Map k a -> [(k, a)]
Data.Map.toList
flippedLookupM :: (Ord val, Ord key) => val -> Data.Map.Map key val -> [key]
flippedLookupM :: val -> Map key val -> [key]
flippedLookupM val
v Map key val
fm =
case val -> Map val [key] -> Maybe [key]
forall k a. Ord k => k -> Map k a -> Maybe a
Data.Map.lookup val
v (Map key val -> Map val [key]
forall key val. (Ord key, Ord val) => Map key val -> Map val [key]
flipM Map key val
fm) of
Maybe [key]
Nothing -> []
Just [key]
x -> [key]
x
forceLookupM :: (Show key, Ord key) => String -> key ->
Data.Map.Map key elt -> elt
forceLookupM :: String -> key -> Map key elt -> elt
forceLookupM String
msg key
k Map key elt
fm =
case key -> Map key elt -> Maybe elt
forall k a. Ord k => k -> Map k a -> Maybe a
Data.Map.lookup key
k Map key elt
fm of
Just elt
x -> elt
x
Maybe elt
Nothing -> String -> elt
forall a. HasCallStack => String -> a
error (String -> elt) -> String -> elt
forall a b. (a -> b) -> a -> b
$ String
msg String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": could not find key " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (key -> String
forall a. Show a => a -> String
show key
k)