module Neovim.Context (
newUniqueFunctionName,
Neovim,
Neovim',
NeovimException(..),
FunctionMap,
FunctionMapEntry,
mkFunctionMap,
runNeovim,
forkNeovim,
err,
errOnInvalidResult,
restart,
quit,
ask,
asks,
get,
gets,
put,
modify,
throwError,
module Control.Monad.IO.Class,
#if __GLASGOW_HASKELL__ <= 710
module Control.Applicative,
#endif
) where
import Neovim.Classes
import Neovim.Context.Internal (FunctionMap, FunctionMapEntry,
Neovim, Neovim', forkNeovim,
mkFunctionMap,
newUniqueFunctionName, runNeovim)
import Neovim.Exceptions (NeovimException (..))
import qualified Neovim.Context.Internal as Internal
#if __GLASGOW_HASKELL__ <= 710
import Control.Applicative
#endif
import Control.Concurrent (putMVar)
import Control.Exception
import Control.Monad.Except
import Control.Monad.IO.Class
import Control.Monad.Reader
import Control.Monad.State
import Data.MessagePack (Object)
import Text.PrettyPrint.ANSI.Leijen (Pretty (..))
err :: Pretty err => err -> Neovim r st a
err = throw . ErrorMessage . pretty
errOnInvalidResult :: (NvimObject o)
=> Neovim r st (Either NeovimException Object)
-> Neovim r st o
errOnInvalidResult a = a >>= \case
Left o ->
(err . show) o
Right o -> case fromObject o of
Left e ->
err e
Right x ->
return x
restart :: Neovim r st ()
restart = liftIO . flip putMVar Internal.Restart =<< Internal.asks' Internal.transitionTo
quit :: Neovim r st ()
quit = liftIO . flip putMVar Internal.Quit =<< Internal.asks' Internal.transitionTo