nvim-hs-2.3.2.1: src/Neovim/Plugin/Internal.hs
{-# LANGUAGE ExistentialQuantification #-}
{- |
Module : Neovim.Plugin.Internal
Description : Split module that can import Neovim.Context without creating import circles
Copyright : (c) Sebastian Witte
License : Apache-2.0
Maintainer : woozletoff@gmail.com
Stability : experimental
Portability : GHC
-}
module Neovim.Plugin.Internal (
ExportedFunctionality (..),
getFunction,
getDescription,
NeovimPlugin (..),
Plugin (..),
wrapPlugin,
) where
import Neovim.Context (Neovim)
import Neovim.Plugin.Classes (
FunctionalityDescription,
HasFunctionName (..),
)
import Data.MessagePack (Object)
{- | This data type is used in the plugin registration to properly register the
functions.
-}
newtype ExportedFunctionality env
= EF (FunctionalityDescription, [Object] -> Neovim env Object)
-- | Extract the description of an 'ExportedFunctionality'.
getDescription :: ExportedFunctionality env -> FunctionalityDescription
getDescription (EF (d, _)) = d
-- | Extract the function of an 'ExportedFunctionality'.
getFunction :: ExportedFunctionality env -> [Object] -> Neovim env Object
getFunction (EF (_, f)) = f
instance HasFunctionName (ExportedFunctionality env) where
name = name . getDescription
nvimMethod = nvimMethod . getDescription
-- | This data type contains meta information for the plugin manager.
data Plugin env = Plugin
{ environment :: env
, exports :: [ExportedFunctionality env]
}
{- | 'Plugin' values are wraped inside this data type via 'wrapPlugin' so that
we can put plugins in an ordinary list.
-}
data NeovimPlugin = forall env. NeovimPlugin (Plugin env)
{- | Wrap a 'Plugin' in some nice blankets, so that we can put them in a simple
list.
-}
wrapPlugin :: Applicative m => Plugin env -> m NeovimPlugin
wrapPlugin = pure . NeovimPlugin