packages feed

ribosome-host-0.9.9.9: lib/Ribosome/Host/Api/Autocmd.hs

-- |Helpers for defining autocmds.
module Ribosome.Host.Api.Autocmd where

import Data.MessagePack (Object)
import Prelude hiding (group)

import Ribosome.Host.Api.Data (nvimCreateAugroup, nvimCreateAutocmd)
import Ribosome.Host.Class.Msgpack.Encode (toMsgpack)
import Ribosome.Host.Class.Msgpack.Map (msgpackMap)
import Ribosome.Host.Data.RpcCall (RpcCall)
import Ribosome.Host.Data.RpcType (
  AutocmdBuffer (AutocmdBuffer),
  AutocmdEvents (AutocmdEvents),
  AutocmdGroup (AutocmdGroup),
  AutocmdId (AutocmdId),
  AutocmdOptions (..),
  AutocmdPatterns (AutocmdPatterns),
  )

-- |Create an @augroup@ if the first argument is 'Just', then call the second argument.
--
-- The parameter of the callback is a 'Map' suitable to be passed to 'nvimCreateAutocmd', containing the group name.
withAugroup :: Maybe AutocmdGroup -> (Map Text Object -> RpcCall a) -> RpcCall a
withAugroup (Just (AutocmdGroup g)) f =
  nvimCreateAugroup g [("clear", toMsgpack False)] *> f [("group", toMsgpack g)]
withAugroup Nothing f =
  f mempty

-- |Create an autocmd.
autocmd ::
  -- |Trigger events.
  AutocmdEvents ->
  -- |Options as defined for @:autocmd@.
  AutocmdOptions ->
  -- |The command to execute.
  Text ->
  RpcCall AutocmdId
autocmd (AutocmdEvents events) AutocmdOptions {..} cmd =
  withAugroup group \ grp -> AutocmdId <$> nvimCreateAutocmd events (opts <> bufPat <> grp)
  where
    opts =
      msgpackMap ("command", cmd) ("once", once) ("nested", nested)
    bufPat =
      either  bufOpt patternOpt target
    patternOpt (AutocmdPatterns pat) =
      [("pattern", toMsgpack pat)]
    bufOpt (AutocmdBuffer buf) =
      [("buffer", toMsgpack buf)]