packages feed

nvim-hs-2.3.2.1: src/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,
    NeovimException (..),
    exceptionToDoc,
    FunctionMap,
    FunctionMapEntry,
    mkFunctionMap,
    runNeovim,
    err,
    errOnInvalidResult,
    restart,
    quit,
    subscribe,
    unsubscribe,
    ask,
    asks,
    get,
    gets,
    put,
    modify,
    Doc,
    AnsiStyle,
    docToText,
    throwError,
    module Control.Monad.IO.Class,
) where

import Neovim.Classes
import Neovim.Context.Internal (
    FunctionMap,
    FunctionMapEntry,
    Neovim,
    mkFunctionMap,
    newUniqueFunctionName,
    runNeovim,
    subscribe,
    unsubscribe,
 )
import Neovim.Exceptions (NeovimException (..), exceptionToDoc)

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)

-- | @'throw'@ specialized to a 'Pretty' value.
err :: Doc AnsiStyle -> Neovim env a
err = throw . ErrorMessage

errOnInvalidResult ::
    (NvimObject o) =>
    Neovim env (Either NeovimException Object) ->
    Neovim env o
errOnInvalidResult a =
    a >>= \case
        Left o ->
            (err . exceptionToDoc) o
        Right o -> case fromObject o of
            Left e ->
                err e
            Right x ->
                return x

-- | Initiate a restart of the plugin provider.
restart :: Neovim env ()
restart = liftIO . flip putMVar Internal.Restart =<< Internal.asks' Internal.transitionTo

-- | Initiate the termination of the plugin provider.
quit :: Neovim env ()
quit = liftIO . flip putMVar Internal.Quit =<< Internal.asks' Internal.transitionTo