{-# language DeriveDataTypeable #-}
module Language.Haskell.TH.Instances.Internal.Utils
  (module Language.Haskell.TH.Instances.Internal.Utils
  ,module X) where
import Language.Haskell.TH as X
import Data.Map as X (Map, lookup,adjust,fromList,insert,traverseWithKey)

mapLookup :: Ord k => k -> Map k v -> Maybe v
mapLookup = X.lookup

type Set k = Map k ()

-- | Initialize a Map from a default value and a list of keys
fromKeys :: Ord k => v -> [k] -> Map k v
fromKeys z xs = let zs = z:zs in fromList $ zip xs zs

(<&>) :: Functor f => f a -> (a -> b) -> f b
(<&>) = flip (<$>)

adjustMany :: (Ord k, Foldable t) => (a -> as -> as) -> Map k as -> t (k,a) -> Map k as
adjustMany ins m0 x = foldr (\(k,a) -> adjust (ins a) k) m0 x