nvim-hs-0.2.0: library/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(..),
StatefulFunctionality(..),
getFunction,
getDescription,
NeovimPlugin(..),
Plugin(..),
wrapPlugin,
) where
import Neovim.Context
import Neovim.Plugin.Classes
import Data.MessagePack
-- | This data type is used in the plugin registration to properly register the
-- functions.
newtype ExportedFunctionality r st
= EF (FunctionalityDescription, [Object] -> Neovim r st Object)
-- | Extract the description of an 'ExportedFunctionality'.
getDescription :: ExportedFunctionality r st -> FunctionalityDescription
getDescription (EF (d,_)) = d
-- | Extract the function of an 'ExportedFunctionality'.
getFunction :: ExportedFunctionality r st -> [Object] -> Neovim r st Object
getFunction (EF (_, f)) = f
instance HasFunctionName (ExportedFunctionality r st) where
name = name . getDescription
-- | This datatype contains the initial state (mutable and immutable) for the
-- functionalities defined here.
data StatefulFunctionality r st = StatefulFunctionality
{ readOnly :: r
, writable :: st
, functionalities :: [ExportedFunctionality r st]
}
-- | This data type contains meta information for the plugin manager.
--
data Plugin r st = Plugin
{ exports :: [ExportedFunctionality () ()]
, statefulExports :: [StatefulFunctionality r st]
}
-- | 'Plugin' values are wraped inside this data type via 'wrapPlugin' so that
-- we can put plugins in an ordinary list.
data NeovimPlugin = forall r st. NeovimPlugin (Plugin r st)
-- | Wrap a 'Plugin' in some nice blankets, so that we can put them in a simple
-- list.
wrapPlugin :: Applicative m => Plugin r st -> m NeovimPlugin
wrapPlugin = pure . NeovimPlugin