module Ribosome.Api.Buffer(
  edit,
  buflisted,
  setBufferContent,
  bufferContent,
  currentBufferContent,
  setCurrentBufferContent,
) where

import Neovim (
  Neovim,
  Buffer,
  NvimObject(..),
  Object,
  toObject,
  vim_command',
  vim_call_function',
  buffer_get_number',
  buffer_get_lines',
  buffer_set_lines',
  vim_get_current_buffer',
  )
import Ribosome.Data.Ribo (Ribo)

edit :: FilePath -> Ribo e ()
edit path = vim_command' $ "silent! edit " ++ path

nvimCallBool :: String -> [Object] -> Neovim e Bool
nvimCallBool fun args =
  vim_call_function' fun args >>= fromObject'

buflisted :: Buffer -> Neovim e Bool
buflisted buf = do
  num <- buffer_get_number' buf
  nvimCallBool "buflisted" [toObject num]

bufferContent :: Buffer -> Neovim e [String]
bufferContent buffer =
  buffer_get_lines' buffer 0 (-1) False

currentBufferContent :: Neovim e [String]
currentBufferContent = do
  buffer <- vim_get_current_buffer'
  bufferContent buffer

setBufferContent :: Buffer -> [String] -> Neovim e ()
setBufferContent buffer =
  buffer_set_lines' buffer 0 (-1) False

setCurrentBufferContent :: [String] -> Neovim e ()
setCurrentBufferContent content = do
  buffer <- vim_get_current_buffer'
  setBufferContent buffer content