;;; Comments:
;; By defalt dired-sort-toggle toggle between by date / by name, we
;; extend it to toggle by looping throught the list of
;; `dired-listing-switches-others'
(setopt dired-listing-switches "-AlthG") ;;  --group-directories-first

(defvar dired-listing-switches-name "by date") ; by date by default here.

(defvar dired-listing-switches-others
      '(("by name" . "-AlhG")
        ("by size" . "-AlShG")))

(defun get-next-item-by-string-value (clist value)
  (cl-loop for pair in clist
           for i from 1
           when (string-equal (cdr pair) value)
           do (cl-return (nth i clist))
           finally return nil))
;; test:
;; (cl-assert (equal (get-next-item-by-string-value dired-listing-switches-others "-AlhG") '("by size" . "-AlShG")))

(defun dired-sort-toggle()
  "Rewrite of `dired-sort-toggle'.
Loop over `dired-listing-switches' +
`dired-listing-switches-others' and set next sorting switch."
  (interactive)
  (let* ((new-clist
          ;; loop of switches
          (append (list (cons dired-listing-switches-name dired-listing-switches))
                  dired-listing-switches-others
                  (list (cons dired-listing-switches-name dired-listing-switches))))
         ;; next item
         (pair (get-next-item-by-string-value new-clist dired-actual-switches))
         (name (if pair
                  (car pair)
                ;; else
                dired-listing-switches-name))
         (switch (if pair
                  (cdr pair)
                ;; else
                dired-listing-switches)))
    (setq dired-actual-switches switch)
    (setq mode-name (concat "Dired " name))
    (revert-buffer)))
