{-# LANGUAGE ExistentialQuantification #-}
module Neovim.Plugin.Internal (
ExportedFunctionality(..),
getFunction,
getDescription,
NeovimPlugin(..),
Plugin(..),
wrapPlugin,
) where
import Neovim.Context
import Neovim.Plugin.Classes
import Data.MessagePack
newtype ExportedFunctionality env
= EF (FunctionalityDescription, [Object] -> Neovim env Object)
getDescription :: ExportedFunctionality env -> FunctionalityDescription
getDescription (EF (d,_)) = d
getFunction :: ExportedFunctionality env -> [Object] -> Neovim env Object
getFunction (EF (_, f)) = f
instance HasFunctionName (ExportedFunctionality env) where
name = name . getDescription
nvimMethod = nvimMethod . getDescription
data Plugin env = Plugin
{ environment :: env
, exports :: [ExportedFunctionality env]
}
data NeovimPlugin = forall env. NeovimPlugin (Plugin env)
wrapPlugin :: Applicative m => Plugin env -> m NeovimPlugin
wrapPlugin = pure . NeovimPlugin