[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/workroom 40acb8c7b8 45/74: O(n) switch-to-buffer instead o
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/workroom 40acb8c7b8 45/74: O(n) switch-to-buffer instead of O(n^2) in project workrooms |
Date: |
Sun, 27 Nov 2022 16:03:28 -0500 (EST) |
branch: elpa/workroom
commit 40acb8c7b8334a5cf9717ce3f91d07722735f5b2
Author: Akib Azmain Turja <akib@disroot.org>
Commit: Akib Azmain Turja <akib@disroot.org>
O(n) switch-to-buffer instead of O(n^2) in project workrooms
---
workroom.el | 87 +++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 59 insertions(+), 28 deletions(-)
diff --git a/workroom.el b/workroom.el
index ccf4024c83..7de5169bab 100644
--- a/workroom.el
+++ b/workroom.el
@@ -167,8 +167,8 @@ value can't restored."
(defcustom workroom-mode-lighter
'(:eval
- (let ((face (if (memq (current-buffer) (workroom-buffer-list
- (workroom-current-room)))
+ (let ((face (if (workroom-member-buffer-p
+ (workroom-current-room) (current-buffer))
'compilation-info
'warning)))
`(" WR["
@@ -320,11 +320,15 @@ what to do. ACTION can any of:
`:add-buffer'
Add BUFFER as a member of workroom ROOM. BUFFER is the third
- argument and is a non-member buffer.
+ argument.
`:remove-buffer'
Remove BUFFER from the member list of workroom ROOM. BUFFER is the
- third argument and is a member buffer.
+ third argument.
+
+`:member-buffer-p'
+ Return non-nil if BUFFER is a member buffer of workroom ROOM.
+ BUFFER is the third argument.
`:clone'
Clone buffer list from workroom SOURCE to workroom ROOM. SOURCE is
@@ -526,6 +530,11 @@ Choose the view's name using
`workroom-generate-new-view-name'."
"Return the buffer list of workroom ROOM."
(funcall (workroom--room-buffer-manager room) room :list-buffers))
+(defun workroom-member-buffer-p (room buffer)
+ "Return non-nil if BUFFER is a member buffer of ROOM."
+ (funcall (workroom--room-buffer-manager room)
+ room :member-buffer-p buffer))
+
(defun workroom-current-room (&optional frame)
"Return the current workroom of FRAME."
(frame-parameter frame 'workroom-current-room))
@@ -623,8 +632,8 @@ be a string. DEF, REQUIRE-MATCH and PREDICATE is same as in
(read-buffer
prompt def require-match
(lambda (cand)
- (and (memq (get-buffer (if (consp cand) (car cand) cand))
- (workroom-buffer-list room))
+ (and (workroom-member-buffer-p
+ room (get-buffer (if (consp cand) (car cand) cand)))
(or (not predicate) (funcall predicate cand)))))))
(defun workroom--read-non-member-buffer ( room prompt &optional def
@@ -638,9 +647,9 @@ be a string. DEF, REQUIRE-MATCH and PREDICATE is same as in
(read-buffer
prompt def require-match
(lambda (cand)
- (and (not
- (memq (get-buffer (if (consp cand) (car cand) cand))
- (workroom-buffer-list room)))
+ (and (not (workroom-member-buffer-p
+ room (get-buffer
+ (if (consp cand) (car cand) cand))))
(or (not predicate) (funcall predicate cand)))))))
(defun workroom-read-buffer-function ( prompt &optional def
@@ -952,14 +961,14 @@ ROOM is should be a workroom, or a name of a workroom."
(signal 'wrong-type-argument `(workroomp . ,room)))
(let ((buffers (workroom-buffer-list room)))
(workroom-kill room)
- (dolist (buffer buffers)
- (and (or kill-all
- (cl-every
- (lambda (room)
- (not (memq buffer (workroom-buffer-list room))))
- (remove (workroom-get-default)
- workroom--rooms)))
- (kill-buffer buffer)))))
+ (let ((rooms (remove (workroom-get-default) workroom--rooms)))
+ (dolist (buffer buffers)
+ (and (or kill-all
+ (cl-every
+ (lambda (room)
+ (not (workroom-member-buffer-p buffer room)))
+ rooms))
+ (kill-buffer buffer))))))
(defun workroom-kill-view (room view)
"Kill view VIEW of workroom ROOM.
@@ -1149,8 +1158,8 @@ If ROOM is the default workroom, do nothing."
(list (get-buffer-create
(workroom--read-non-member-buffer
(workroom-current-room) "Add buffer: "
- (unless (memq (current-buffer) (workroom-buffer-list
- (workroom-current-room)))
+ (unless (workroom-member-buffer-p
+ (workroom-current-room) (current-buffer))
(current-buffer))))
nil)))
(setq room (if (stringp room)
@@ -1160,7 +1169,7 @@ If ROOM is the default workroom, do nothing."
(or room (workroom-current-room))))
(unless (workroom-live-p room)
(signal 'wrong-type-argument `(workroom-live-p . ,room)))
- (unless (memq buffer (workroom-buffer-list (workroom-current-room)))
+ (unless (workroom-member-buffer-p (workroom-current-room) buffer)
(funcall (workroom--room-buffer-manager room)
room :add-buffer buffer)))
@@ -1178,8 +1187,8 @@ If ROOM is the default workroom, kill buffer."
(workroom--read-member-buffer
(workroom-current-room)
"Remove buffer: "
- (when (memq (current-buffer) (workroom-buffer-list
- (workroom-current-room)))
+ (when (workroom-member-buffer-p
+ (workroom-current-room) (current-buffer))
(current-buffer))
t))
nil)))
@@ -1190,7 +1199,7 @@ If ROOM is the default workroom, kill buffer."
(or room (workroom-current-room))))
(unless (workroom-live-p room)
(signal 'wrong-type-argument `(workroom-live-p . ,room)))
- (when (memq buffer (workroom-buffer-list (workroom-current-room)))
+ (when (workroom-member-buffer-p (workroom-current-room) buffer)
(funcall (workroom--room-buffer-manager room)
room :remove-buffer buffer)))
@@ -1242,6 +1251,9 @@ ACTION and ARGS are also described there."
(cl-destructuring-bind (buffer) args
(setf (workroom-buffer-manager-data room)
(delq buffer (workroom-buffer-manager-data room)))))
+ (:member-buffer-p
+ (cl-destructuring-bind (buffer) args
+ (memq buffer (workroom-buffer-manager-data room))))
(:clone
(cl-destructuring-bind (source) args
(setf (workroom-buffer-manager-data room)
@@ -1287,6 +1299,10 @@ ACTION and ARGS are also described there."
(workroom-set-buffer-manager-function
room #'workroom--default-buffer-manager 'do-not-initialize)
(workroom--default-buffer-manager room :clone (buffer-list))))
+ (:member-buffer-p
+ (cl-destructuring-bind (buffer) args
+ ;; All live buffer are members.
+ (buffer-live-p buffer)))
(:encode
(cl-destructuring-bind () args
;; Nothing, the default workroom can't be encoding (but can
@@ -1377,11 +1393,10 @@ restrict."
(when workroom--in-workroom-ibuffer
(setq-local workroom--ibuffer-room workroom--in-workroom-ibuffer))
(if workroom--ibuffer-room
- (let ((buffer-list (workroom-buffer-list
- workroom--ibuffer-room)))
- (cl-remove-if-not (lambda (entry)
- (memq (car entry) buffer-list))
- buffers))
+ (cl-remove-if-not (lambda (entry)
+ (workroom-member-buffer-p
+ workroom--ibuffer-room (car entry)))
+ buffers)
buffers))
(defun workroom--ibuffer-forget-workroom (&optional _ buffer &rest _)
@@ -1863,6 +1878,22 @@ argument while setting as the buffer manager, PROJECT,
the project."
room :list-buffers))
(push buffer (plist-get (workroom-buffer-manager-data room)
:blacklist)))))
+ (:member-buffer-p
+ (cl-destructuring-bind (buffer) args
+ (and (not (memq buffer
+ (plist-get (workroom-buffer-manager-data room)
+ :blacklist)))
+ (or (memq buffer
+ (plist-get (workroom-buffer-manager-data room)
+ :whitelist))
+ (string-prefix-p
+ (expand-file-name
+ (file-name-as-directory
+ (project-root
+ (plist-get (workroom-buffer-manager-data room)
+ :project))))
+ (expand-file-name
+ (buffer-local-value 'default-directory buffer)))))))
(:clone
(cl-destructuring-bind (source) args
(cl-destructuring-bind (&key project whitelist blacklist)
- [nongnu] elpa/workroom a1f5cc9754 52/74: Make the workroom custom group part of tools group, (continued)
- [nongnu] elpa/workroom a1f5cc9754 52/74: Make the workroom custom group part of tools group, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 3b7b17e2cc 72/74: Bump version to 2.2.4, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom c50e7219a0 07/74: Make README Codeberg compatible, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 31eabf2547 21/74: Add some comments for explaining the code, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 64b465093e 20/74: Make line no more wide than 75 characters, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 6d159a5566 24/74: Use `string=' to compare workroom and view names, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom a4845ad57f 44/74: Don't switch room in workroom-switch if ROOM is current, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 4c4fd7830c 34/74: Add Winner integration, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom e7dc14236e 42/74: Fix out of sync documentation, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 3144324e33 39/74: Add an user manual, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 40acb8c7b8 45/74: O(n) switch-to-buffer instead of O(n^2) in project workrooms,
ELPA Syncer <=
- [nongnu] elpa/workroom 13e648f3db 74/74: Add .dir-locals.el, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom add6fb080d 61/74: Bump version to 2.1.1, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 9974fb58a9 41/74: Add new command workroom-bookmark-multiple, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom a87110f435 56/74: Clone views correctly, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom f9d88f211c 68/74: Bump version to 2.2.2, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom eef13afbbf 66/74: Bump version to 2.2.1, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 1d4c134d60 26/74: Add new command workroom-switch-room, some refactoring, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 497c04d666 15/74: Make lighter customizable, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom b28aae7a13 40/74: Add chapter "Project Integration" to manual, ELPA Syncer, 2022/11/27
- [nongnu] elpa/workroom 98d1158ef0 36/74: Fix key binding of "C-d" in command map, ELPA Syncer, 2022/11/27