module ZM.Util
  ( proxyOf
  -- *State Monad utilities
  , runEnv
  , execEnv
  ) where

import           Control.Monad.Trans.State
import qualified Data.Map                  as M
import           Data.Proxy

-- |Return the proxy for the type of the given value
proxyOf :: a -> Proxy a
proxyOf _ = Proxy ::Proxy a

----------- State Utils
-- |Run a State monad with an empty map as environment
runEnv :: State (M.Map k a1) a -> (a, M.Map k a1)
runEnv op = runState op M.empty

-- |Exec a State monad with an empty map as environment
execEnv :: State (M.Map k a1) a -> M.Map k a1
execEnv op = execState op M.empty