local cmd = vim.cmd                     -- to execute Vim commands e.g. cmd('pwd')
local fn = vim.fn                       -- to call Vim functions e.g. fn.bufnr()
local g = vim.g                         -- a table to access global variables
local opt = vim.opt                     -- to set options
local o = vim.o                         -- to set options

local function map(mode, lhs, rhs, opts)
  local options = {noremap = true}
  if opts then options = vim.tbl_extend('force', options, opts) end
  vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end

local function dump(...)
    local objects = vim.tbl_map(vim.inspect, {...})
    print(unpack(objects))
end

local function call_with_helpers(user_func)
    setfenv(user_func,
        vim.tbl_extend('force', getfenv(), get_helpers()))
    local status, err = pcall(user_func)
    if not status then
      print('Failure running setup function: ' .. vim.inspect(err))
    else
        return status
    end
end

function get_helpers()
    return {
        map = map,
        cmd = cmd,
        fn = fn,
        g = g,
        opt = opt,
        o = o,
        dump = dump,
        call_with_helpers = call_with_helpers,
    }
end

return get_helpers()