;;; ztree-util.el --- Auxiliary utilities for the ztree package -*- lexical-binding: t; -*-

;; Copyright (C) 2013-2021  Free Software Foundation, Inc.
;;
;; Author: Alexey Veretennikov <alexey.veretennikov@gmail.com>
;;
;; Created: 2013-11-11
;;
;; Keywords: files tools
;; URL: https://github.com/fourier/ztree
;; Compatibility: GNU Emacs 24.x
;;
;; This file is part of GNU Emacs.
;;
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
;;
;;; Commentary:

;;; Code:


(defmacro def-ztree-local-fun (name doc)
  "Create a buffer-local variable NAME-FUN and a function NAME.
Both variables and a function will have a documentation DOC.
Function will FUNCALL the variable NAME-FUN.
Used to create callbacks.
Example:
(macroexpand-1 '(def-ztree-local-fun add \"Addition\"))
(progn
  (defvar-local add-fun nil \"Addition\")
  (defun add (&rest args) \"Addition\" (apply add-fun args)))"
  (let ((var (intern (concat (symbol-name name) "-fun"))))
    `(progn
       (defvar-local ,var nil
         ,doc)
       (defun ,name (&rest args)
         ,doc
         (apply ,var args)))))

(defun ztree-find (where which)
  "Find element of the list WHERE matching predicate WHICH."
  (catch 'found
    (dolist (elt where)
      (when (funcall which elt)
        (throw 'found elt)))
    nil))

(defun ztree-filter (condp lst)
  "Filter out elements not satisfying predicate CONDP in the list LST.
Taken from http://www.emacswiki.org/emacs/ElispCookbook#toc39"
  (delq nil
        (mapcar (lambda (x) (and (funcall condp x) x)) lst)))


(defun ztree-printable-string (string)
  "Strip newline character from file names, like `Icon\n'.
Argument STRING string to process.'."
  (replace-regexp-in-string "\n" "" string))


(defun ztree-file-short-name (file)
  "By given FILE name return base file/directory name.
Taken from http://lists.gnu.org/archive/html/emacs-devel/2011-01/msg01238.html"
  (let* ((dir (directory-file-name file))
         (simple-dir (file-name-nondirectory dir)))
    ;; check if the root directory
    (if (string= "" simple-dir)
        dir
      (ztree-printable-string simple-dir))))


(defun ztree-car-atom (value)
  "Return VALUE if value is an atom, otherwise (car value) or nil.
Used since `car-safe' returns nil for atoms"
  (if (atom value) value (car value)))


(defun ztree-insert-with-face (text face)
  "Insert TEXT with the FACE provided."
  (let ((start (point)))
    (insert text)
    (put-text-property start (point) 'face face)))

(defun ztree-untrampify-filename (file)
  "Return FILE as the local file name."
  (or (file-remote-p file 'localname) file))

(defun ztree-quotify-string (str)
  "Surround STR with quotes."
  (concat "\"" str "\""))

(defun ztree-same-host-p (file1 file2)
  "Return t if FILE1 and FILE2 are on the same host."
  (let ((file1-remote (file-remote-p file1))
        (file2-remote (file-remote-p file2)))
    (string-equal file1-remote file2-remote)))


(provide 'ztree-util)

;;; ztree-util.el ends here
