nvim-hs-0.0.6: library/Neovim/Context.hs
{-# LANGUAGE LambdaCase #-}
{- |
Module : Neovim.Context
Description : The Neovim context
Copyright : (c) Sebastian Witte
License : Apache-2.0
Maintainer : woozletoff@gmail.com
Stability : experimental
-}
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,
) where
import Neovim.Classes
import Neovim.Context.Internal (FunctionMap, FunctionMapEntry,
Neovim, Neovim',
NeovimException (ErrorMessage),
forkNeovim, mkFunctionMap,
newUniqueFunctionName, runNeovim)
import qualified Neovim.Context.Internal as Internal
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 (Doc, text)
-- | @'throw'@ specialized to 'Doc'. If you do not care about pretty printing,
-- you can simply use 'text' in front of your string or use the
-- @OverloadedStrings@ extension to specify the error message.
err :: Doc -> Neovim r st a
err = throw . ErrorMessage
errOnInvalidResult :: (NvimObject o) => Neovim r st (Either Object Object) -> Neovim r st o
errOnInvalidResult a = a >>= \case
Left o ->
(err . text . show) o
Right o -> case fromObject o of
Left e ->
err e
Right x ->
return x
-- | Initiate a restart of the plugin provider.
restart :: Neovim r st ()
restart = liftIO . flip putMVar Internal.Restart =<< Internal.asks' Internal.transitionTo
-- | Initiate the termination of the plugin provider.
quit :: Neovim r st ()
quit = liftIO . flip putMVar Internal.Quit =<< Internal.asks' Internal.transitionTo