[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/sesman 9108444fd8 040/100: Better sorting and de-duplicati
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/sesman 9108444fd8 040/100: Better sorting and de-duplication in a number of core functions |
Date: |
Tue, 28 Dec 2021 14:06:01 -0500 (EST) |
branch: elpa/sesman
commit 9108444fd800c6ff562c8bed354467fafb6a473d
Author: Vitalie Spinu <spinuvit@gmail.com>
Commit: Vitalie Spinu <spinuvit@gmail.com>
Better sorting and de-duplication in a number of core functions
---
sesman.el | 151 ++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 93 insertions(+), 58 deletions(-)
diff --git a/sesman.el b/sesman.el
index be7835f178..646008f4d5 100644
--- a/sesman.el
+++ b/sesman.el
@@ -98,7 +98,7 @@ Can be either a symbol, or a function returning a symbol.")
((or (equal which '(4)) (eq which 'linked))
(sesman-linked-sessions system))
((or (equal which '(16)) (eq which 'all) (eq which t))
- (sesman--all-system-sessions system))
+ (sesman--all-system-sessions system 'sort))
(t (error "Invalid which argument (%s)" which))))
(defun sesman--cap-system-name (system)
@@ -133,7 +133,7 @@ Can be either a symbol, or a function returning a symbol.")
(setq sesman-links-alist (cons link sesman-links-alist))))
key))
-(defun sesman--link-session-interactively (cxt-type cxt-value session)
+(defun sesman--link-session-interactively (cxt-type cxt-val session)
(let ((system (sesman--system))
(cxt-name (symbol-name cxt-type)))
(if (member cxt-type (sesman-context-types system))
@@ -143,9 +143,9 @@ Can be either a symbol, or a function returning a symbol.")
(format "Link with %s %s: "
cxt-name (sesman--abbrev-path-maybe
(sesman-context cxt-type
system)))
- (sesman--all-system-sessions system)
+ (sesman--all-system-sessions system 'sort)
'ask-new))))
- (sesman--link-session system session cxt-type cxt-value))
+ (sesman--link-session system session cxt-type cxt-val))
(error (format "%s association not allowed for this system (%s)"
(capitalize cxt-name)
system)))))
@@ -174,8 +174,9 @@ Can be either a symbol, or a function returning a symbol.")
sesman-system)
(error "No `sesman-system' in buffer `%s'" (current-buffer))))
-(defun sesman--all-system-sessions (&optional system)
- "Return a list of sessions registered with SYSTEM."
+(defun sesman--all-system-sessions (&optional system sort)
+ "Return a list of sessions registered with SYSTEM.
+If SORT is non-nil, sort in relevance order."
(let ((system (or system (sesman--system)))
sessions)
(maphash
@@ -183,7 +184,9 @@ Can be either a symbol, or a function returning a symbol.")
(when (eql (car k) system)
(push s sessions)))
sesman-sessions-hashmap)
- (sesman--sort-sessions system sessions)))
+ (if sort
+ (sesman--sort-sessions system sessions)
+ sessions)))
;; FIXME: make this a macro
(defun sesman--link-lookup-fn (&optional system ses-name cxt-type cxt-val x)
@@ -471,14 +474,30 @@ use `sesman-more-recent-p' utility in this method."
(let ((system (or system (sesman--system))))
(gethash (cons system session-name) sesman-sessions-hashmap)))
-(defun sesman-sessions (system)
+(defun sesman-sessions (system &optional sort)
"Return a list of all sessions registered with SYSTEM.
+If SORT is non-nil, sessions are sorted in the relevance order and
`sesman-linked-sessions' lead the list."
(let ((system (or system (sesman--system))))
+ (if sort
+ (delete-dups
+ (append (sesman-linked-sessions system)
+ ;; (sesman-friendly-sessions system)
+ (sesman--all-system-sessions system t)))
+ (sesman--all-system-sessions system))))
+
+(defun sesman-linked-sessions (system &optional cxt-types)
+ "Return a list of SYSTEM sessions linked in current context.
+CXT-TYPES is a list of context types to consider. Defaults to the
+list returned from `sesman-context-types'."
+ (let* ((system (or system (sesman--system)))
+ (cxt-types (or cxt-types (sesman-context-types system))))
+ ;; just in case some links are lingering due to user errors
+ (sesman--clear-links)
(delete-dups
- (append (sesman-linked-sessions system)
- ;; (sesman-friendly-sessions system)
- (sesman--all-system-sessions system)))))
+ (mapcar (lambda (assoc)
+ (gethash (car assoc) sesman-sessions-hashmap))
+ (sesman-current-links system nil cxt-types)))))
(defun sesman-has-sessions-p (system)
"Return t if there is at least one session registered with SYSTEM."
@@ -542,24 +561,15 @@ CXT-TYPES is as in `sesman-linked-sessions'."
(or (car (sesman-linked-sessions system cxt-types))
(user-error "No linked %s sessions" system)))
-(defun sesman-linked-sessions (system &optional cxt-types)
- "Return a list of SYSTEM sessions linked in current context.
-CXT-TYPES is a list of context types to consider. Defaults to the
-list returned from `sesman-context-types'."
- (let* ((system (or system (sesman--system)))
- (cxt-types (or cxt-types (sesman-context-types system))))
- ;; just in case some links are lingering due to user errors
- (sesman--clear-links)
- (mapcar (lambda (assoc)
- (gethash (car assoc) sesman-sessions-hashmap))
- (sesman-current-links system cxt-types))))
-
-(defun sesman-session-links (system session &optional as-string)
+(defvar sesman--cxt-abbrevs '(buffer "buf" project "proj" directory "dir"))
+(defun sesman-grouped-links (system session &optional sort-current-first
as-string)
"Retrieve all links for SYSTEM's SESSION from the global
`sesman-links-alist'.
Return an alist of the form
((buffer buffers..)
(directory directories...)
(project projects...)).
+When `sort-current-first' is non-nil, a cons of two lists as above is returned
+with car containing links relevant in current context and cdr all other links.
If AS-STRING is non-nil, return an equivalent string representation."
(let* ((system (or system (sesman--system)))
(session (or session (sesman-current-session system)))
@@ -569,47 +579,72 @@ If AS-STRING is non-nil, return an equivalent string
representation."
(sesman--sort-links system)
(reverse)))
(out (mapcar (lambda (x) (list x))
- (sesman-context-types system))))
+ (sesman-context-types system)))
+ (out-rel (when sort-current-first
+ (copy-alist out))))
(mapc (lambda (link)
(let* ((type (sesman--lnk-context-type link))
(val (sesman--lnk-value link))
- (entry (assoc type out)))
+ (entry (if (and sort-current-first
+ (sesman-relevant-link-p link))
+ (assoc type out-rel)
+ (assoc type out))))
(when entry
(setcdr entry (cons val (cdr entry))))))
links)
- (let ((out (delq nil (mapcar (lambda (el) (and (cdr el) el)) out))))
+ (let ((out (delq nil (mapcar (lambda (el) (and (cdr el) el)) out)))
+ (out-rel (delq nil (mapcar (lambda (el) (and (cdr el) el))
out-rel))))
(if as-string
- (mapconcat (lambda (link-vals)
- (let ((type (car link-vals)))
- (mapconcat (lambda (l)
- (let ((l (if (listp l) (cdr l) l)))
- (format "%s(%s)" type l)))
- (cdr link-vals)
- " ")))
- out
- " ")
- out))))
-
-(defun sesman-links (system &optional session-name cxt-types)
- "Retrieve all links for SYSTEM, SESSION-NAME and CXT-TYPES."
- (let ((lfn (sesman--link-lookup-fn system session-name cxt-types)))
- (seq-filter lfn sesman-links-alist)))
-
-(defun sesman-current-links (system &optional cxt-types)
- "Retrieve all active links in current context for SYSTEM.
-CXT-TYPES is a list of context types to consider. Returned links
-are a subset of `sesman-links-alist' sorted in order of relevance."
+ (let ((fmt-fn (lambda (link-vals)
+ (let ((type (car link-vals)))
+ (mapconcat (lambda (v)
+ (format "%s(%s)"
+ (or (plist-get
sesman--cxt-abbrevs type) type)
+ (sesman--abbrev-path-maybe
v)))
+ (cdr link-vals)
+ ", ")))))
+ (if out-rel
+ (concat (mapconcat fmt-fn out-rel ", ")
+ (when out " | ")
+ (mapconcat fmt-fn out ", "))
+ (mapconcat fmt-fn out ", ")))
+ (if sort-current-first
+ (cons out-rel out))))))
+
+(defun sesman-links (system &optional session-or-name cxt-types sort)
+"Retrieve all links for SYSTEM, SESSION-OR-NAME and CXT-TYPES.
+SESSION-OR-NAME can be either a session or a name of the session. If SORT is
+non-nil links are sorted in relevance order and `sesman-current-links' lead the
+list, otherwise links are returned in the creation order."
+(let* ((ses-name (if (listp session-or-name)
+ (car session-or-name)
+ session-or-name))
+ (lfn (sesman--link-lookup-fn system ses-name cxt-types)))
+ (if sort
+ (delete-dups (append
+ (sesman-current-links system ses-name)
+ (sesman--sort-links system (seq-filter lfn
sesman-links-alist))))
+ (seq-filter lfn sesman-links-alist))))
+
+(defun sesman-current-links (system &optional session-or-name cxt-types)
+ "Retrieve all active links in current context for SYSTEM and SESSION-OR-NAME.
+SESSION-OR-NAME can be either a session or a name of the session. CXT-TYPES is
a
+list of context types to consider. Returned links are a subset of
+`sesman-links-alist' sorted in order of relevance."
;; mapcan is a built-in in 26.1; don't want to require cl-lib for one
function
- (seq-mapcat
- (lambda (cxt-type)
- (let ((lfn (sesman--link-lookup-fn system nil cxt-type)))
- (sesman--sort-links
- system
- (seq-filter (lambda (l)
- (and (funcall lfn l)
- (sesman-relevant-context-p cxt-type (nth 2 l))))
- sesman-links-alist))))
- (or cxt-types (sesman-context-types system))))
+ (let ((ses-name (if (listp session-or-name)
+ (car session-or-name)
+ session-or-name)))
+ (seq-mapcat
+ (lambda (cxt-type)
+ (let ((lfn (sesman--link-lookup-fn system ses-name cxt-type)))
+ (sesman--sort-links
+ system
+ (seq-filter (lambda (l)
+ (and (funcall lfn l)
+ (sesman-relevant-context-p cxt-type
(sesman--lnk-value l))))
+ sesman-links-alist))))
+ (or cxt-types (sesman-context-types system)))))
(defun sesman-has-links-p (system &optional cxt-types)
"Return t if there is at least one linked session.
@@ -727,7 +762,7 @@ buffers."
;;; Contexts
(cl-defgeneric sesman-context (_cxt-type _system)
- "Given context type CXT-TYPE return the context.")
+ "Given SYSTEM and context type CXT-TYPE return the context.")
(cl-defmethod sesman-context ((_cxt-type (eql buffer)) _system)
"Return current buffer."
(current-buffer))
- [nongnu] elpa/sesman 14475d8192 080/100: [Fix #10] Defalias sesman-link-session, (continued)
- [nongnu] elpa/sesman 14475d8192 080/100: [Fix #10] Defalias sesman-link-session, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 53efa0a9ca 086/100: Honor sesman-follow-symlinks in path expansion and project lookup, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 04df98807f 070/100: Change font of sesman-buffer-face, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 7fe522431e 068/100: Expand file-name because the backend might not do it, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 35d6562ad8 006/100: Add more link specific utilities, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 0d8d1bef45 022/100: Version 0.1.1, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman e341db8d97 095/100: Update menu, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 0d3d016732 023/100: Add autoloads for user level commands, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 2e4205c7d9 046/100: Fix return value of sesman-grouped-links, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman ae68b3facf 042/100: [#8] Improve session "info" infrastructure, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 9108444fd8 040/100: Better sorting and de-duplication in a number of core functions,
ELPA Syncer <=
- [nongnu] elpa/sesman ba2756caf7 063/100: Fix compilation warnings, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman fcdb6846f3 061/100: Make checkdoc happy, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 602d818dd0 073/100: Autoload sesman keymap, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 2b1b624e7a 074/100: Implement friendly session mechanism, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 19151a8b60 065/100: Add colors for marking dir, proj and buf in listings, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 1f5b2b2338 075/100: More consistent empty prefix in sesman-info, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 59f4a2442e 077/100: Simplify system API by subsuming sesman-linked/friendly-sessions into sesman-sessions, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 4b2507d1ee 076/100: Optimize sesman-current-session, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman edee869c20 096/100: Sesman menu: Add Browser, Move Unlink, ELPA Syncer, 2021/12/28
- [nongnu] elpa/sesman 93123f6cef 093/100: Rename seman-menu-open -> sesman-menu-open, ELPA Syncer, 2021/12/28