{-# LANGUAGE LambdaCase #-}
module Neovim.Util (
withCustomEnvironment,
whenM,
unlessM,
oneLineErrorMessage,
) where
import Control.Monad (forM, forM_, when, unless)
import Neovim.Context
import System.SetEnv
import System.Environment
import qualified Data.Text as T
import UnliftIO (MonadUnliftIO)
import UnliftIO.Exception (bracket)
withCustomEnvironment
:: (Traversable t, MonadUnliftIO m)
=> t (String, Maybe String)
-> m c
-> m c
withCustomEnvironment modifiedEnvironment action =
bracket saveAndSet unset (const action)
where
saveAndSet = do
preservedValues <- forM modifiedEnvironment $ \(var, val) -> liftIO $ do
old <- lookupEnv var
maybe (unsetEnv var) (setEnv var) val
return (var, old)
return preservedValues
unset preservedValues = forM_ preservedValues $ \(var, val) -> liftIO $
maybe (unsetEnv var) (setEnv var) val
whenM :: (Monad m) => m Bool -> m () -> m ()
whenM mp a = mp >>= \p -> when p a
unlessM :: (Monad m) => m Bool -> m () -> m ()
unlessM mp a = mp >>= \p -> unless p a
oneLineErrorMessage :: Doc AnsiStyle -> T.Text
oneLineErrorMessage d = case T.lines $ docToText d of
(x:_) -> x
[] -> mempty