(local (ufo ts-parsers)
       (values (require :ufo) (require :nvim-treesitter.parsers)))

(fn lsp-folds? [bufnr]
  (accumulate [has false _ client (ipairs (vim.lsp.get_active_clients {: bufnr}))
               &until has]
    (not= client.server_capabilities.foldingRangeProvider nil)))

(ufo.setup {:open_fold_hl_timeout 0
            :provider_selector (fn [bufnr ft _]
                                 (if (lsp-folds? bufnr) [:lsp :indent]
                                     (ts-parsers.has_parser ft) [:treesitter
                                                                 :indent]
                                     [:indent]))})

(tset vim :o :foldcolumn :0)
(tset vim :o :foldlevel 256)
(tset vim :o :foldlevelstart 256)
(tset vim :o :foldenable true)

(let [mopt (. (require :mzte_nv) :utils :map_opt)]
  ;; toggle fold
  (vim.keymap.set :n :t :za mopt)
  (vim.keymap.set :n :zO ufo.openAllFolds mopt)
  (vim.keymap.set :n :zC ufo.closeAllFolds mopt))
