-- [nfnl] Compiled from fnl/dots/utils.fnl by https://github.com/Olical/nfnl, do not edit.
local _local_1_ = require("dots.prelude")
local autoload = _local_1_["autoload"]
local a = _local_1_["a"]
local str = _local_1_["str"]
local function plugin(name, _3fopts)
  if (nil == _3fopts) then
    return name
  else
    _3fopts[1] = name
    return _3fopts
  end
end
local function prepend(a0, list)
  local x = list
  table.insert(x, 1, a0)
  return x
end
local function all(f)
  local function _3_(_241)
    return not f(_241)
  end
  return not a.some(_3_)
end
local function single_to_list(x)
  if a["table?"](x) then
    return x
  else
    return {x}
  end
end
local function contains_3f(list, elem)
  local function _5_(_241)
    return (elem == _241)
  end
  do local _ = a.some(_5_, list) end
  return false
end
local function filter_table(f, t)
  local tbl_16_auto = {}
  for k, v in pairs(t) do
    local k_17_auto, v_18_auto = nil, nil
    if f(k, v) then
      k_17_auto, v_18_auto = k, v
    else
      k_17_auto, v_18_auto = nil
    end
    if ((k_17_auto ~= nil) and (v_18_auto ~= nil)) then
      tbl_16_auto[k_17_auto] = v_18_auto
    else
    end
  end
  return tbl_16_auto
end
local function split_last(s, sep)
  for i = #s, 1, -1 do
    local c = s:sub(i, i)
    if (sep == c) then
      local left = s:sub(1, (i - 1))
      local right = s:sub((i + 1))
      return { left, right }
    else
    end
  end
  return {s}
end
local function find_where(pred, xs)
  for _, x in ipairs(xs) do
    if pred(x) then
      return x
    else
    end
  end
  return nil
end
local function find_map(f, xs)
  for _, x in ipairs(xs) do
    local res = f(x)
    if (nil ~= res) then
      return res
    else
    end
  end
  return nil
end
local function keep_if(f, x)
  if f(x) then
    return x
  else
    return nil
  end
end
local function map_values(f, t)
  local tbl = {}
  for k, v in pairs(t) do
    tbl[k] = f(v)
  end
  return tbl
end
local function without_keys(keys, t)
  local function _12_(_241)
    return not contains_3f(keys, _241)
  end
  return filter_table(_12_, t)
end
local function keymap(modes, from, to, _3fopts)
  local full_opts = without_keys({"buffer"}, a.merge({noremap = true, silent = true}, (_3fopts or {})))
  for _, mode in ipairs(single_to_list(modes)) do
    local keymap_opts
    local _13_
    if (nil ~= _3fopts) then
      _13_ = _3fopts.buffer
    else
      _13_ = nil
    end
    if _13_ then
      keymap_opts = a.assoc(full_opts, "buffer", 0)
    else
      keymap_opts = full_opts
    end
    vim.keymap.set(mode, from, to, keymap_opts)
  end
  return nil
end
local function del_keymap(mode, from, _3fbuf_local)
  local function _16_()
    if _3fbuf_local then
      return {buffer = 0}
    else
      return {}
    end
  end
  return vim.keymap.del(mode, from, _16_())
end
local function buffer_content(bufnr)
  return vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
end
local function surround_if_present(a0, mid, b)
  if mid then
    return (a0 .. mid .. b)
  else
    return ""
  end
end
local function highlight(group_arg, colset)
  local default = {fg = "NONE", bg = "NONE", gui = "NONE"}
  local opts = a.merge(default, colset)
  for _, group in ipairs(single_to_list(group_arg)) do
    vim.cmd(("hi! " .. group .. " guifg='" .. opts.fg .. "' guibg='" .. opts.bg .. "' gui='" .. opts.gui .. "'"))
  end
  return nil
end
local function highlight_add(group_arg, colset)
  for _, group in ipairs(single_to_list(group_arg)) do
    vim.cmd(("hi! " .. group .. surround_if_present(" guibg='", colset.bg, "'") .. surround_if_present(" guifg='", colset.fg, "'") .. surround_if_present(" gui='", colset.gui, "'")))
  end
  return nil
end
local function shorten_path(path, seg_length, shorten_after)
  local segments = str.split(path, "/")
  if ((shorten_after > #path) or (2 > #segments)) then
    return path
  else
    local init = a.butlast(segments)
    local filename = a.last(segments)
    local shortened_segs
    local function _18_(_241)
      return string.sub(_241, 1, seg_length)
    end
    shortened_segs = a.map(_18_, init)
    return (str.join("/", shortened_segs) .. "/" .. filename)
  end
end
local function comp(f, g)
  local function _20_(...)
    return f(g(...))
  end
  return _20_
end
local function get_selection()
  local _let_21_ = vim.fn.getpos("'<")
  local _ = _let_21_[1]
  local s_start_line = _let_21_[2]
  local s_start_col = _let_21_[3]
  local _let_22_ = vim.fn.getpos("'>")
  local _0 = _let_22_[1]
  local s_end_line = _let_22_[2]
  local s_end_col = _let_22_[3]
  local n_lines = (1 + math.abs((s_end_line - s_start_line)))
  local lines = vim.api.nvim_buf_get_lines(0, (s_start_line - 1), s_end_line, false)
  if (nil == lines[1]) then
    return s_start_line, s_end_line, lines
  else
    lines[1] = string.sub(lines[1], s_start_col, -1)
    if (1 == n_lines) then
      lines[n_lines] = string.sub(lines[n_lines], 1, (1 + (s_end_col - s_start_col)))
    else
      lines[n_lines] = string.sub(lines[n_lines], 1, s_end_col)
    end
    return s_start_line, s_end_line, lines
  end
end
return {plugin = plugin, all = all, ["single-to-list"] = single_to_list, ["contains?"] = contains_3f, ["filter-table"] = filter_table, ["split-last"] = split_last, ["find-where"] = find_where, ["find-map"] = find_map, ["keep-if"] = keep_if, ["map-values"] = map_values, ["without-keys"] = without_keys, keymap = keymap, ["del-keymap"] = del_keymap, ["buffer-content"] = buffer_content, ["surround-if-present"] = surround_if_present, highlight = highlight, ["highlight-add"] = highlight_add, ["shorten-path"] = shorten_path, prepend = prepend, comp = comp, ["get-selection"] = get_selection}