{-# LANGUAGE TemplateHaskell #-}

module Proteome.Plugin(
  plugin,
)
where

import UnliftIO.STM (TVar)
import Neovim (Plugin(..), function', Neovim, StartupConfig, NeovimConfig, NeovimPlugin, Synchronous(..), wrapPlugin)
import Ribosome.Data.Ribosome (Ribosome(Ribosome))
import Proteome.Init
import Proteome.Data.Env
import Proteome.Add (proAdd)
import Proteome.Config (proReadConfig)
import Proteome.Tags (proTags)
import Proteome.Save (proSave)

plugin' :: TVar Env -> Plugin (Ribosome (TVar Env))
plugin' env =
  Plugin {
    environment = Ribosome "proteome" env,
    exports = [
      $(function' 'proteomePoll) Sync,
      $(function' 'proteomeStage1) Async,
      $(function' 'proteomeStage2) Async,
      $(function' 'proteomeStage4) Async,
      $(function' 'proAdd) Async,
      $(function' 'proSave) Async,
      $(function' 'proTags) Async,
      $(function' 'proReadConfig) Sync
    ]
  }

plugin :: Neovim (StartupConfig NeovimConfig) NeovimPlugin
plugin = do
  env <- initialize
  wrapPlugin $ plugin' env