[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/el-search aa4bd02 051/332: el-search: new pattern type
From: |
Stefan Monnier |
Subject: |
[elpa] externals/el-search aa4bd02 051/332: el-search: new pattern type `append' |
Date: |
Tue, 1 Dec 2020 15:48:09 -0500 (EST) |
branch: externals/el-search
commit aa4bd021e8571c443e813a9a5eae89fb28819680
Author: Michael Heerdegen <michael_heerdegen@web.de>
Commit: Michael Heerdegen <michael_heerdegen@web.de>
el-search: new pattern type `append'
---
el-search.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/el-search.el b/el-search.el
index 05bf243..7d625f8 100644
--- a/el-search.el
+++ b/el-search.el
@@ -526,6 +526,59 @@ used to construct the error message."
;;;; Additional pattern type definitions
+(defun el-search--split (matcher1 matcher2 list)
+ "Helper for the append pattern type.
+
+When a splitting of LIST into two lists L1, L2 exist so that Li
+is matched by MATCHERi, return (L1 L2) for such Li, else return
+nil."
+ (let ((try-match (lambda (list1 list2)
+ (when (and (el-search--match-p matcher1 list1)
+ (el-search--match-p matcher2 list2))
+ (list list1 list2))))
+ (list1 list) (list2 '()) (match nil))
+ ;; don't use recursion, this could hit `max-lisp-eval-depth'
+ (while (and (not (setq match (funcall try-match list1 list2)))
+ (consp list1))
+ (let ((last-list1 (last list1)))
+ (if-let ((cdr-last-list1 (cdr last-list1)))
+ ;; list1 is a dotted list. Then list2 must be empty.
+ (progn (setcdr last-list1 nil)
+ (setq list2 cdr-last-list1))
+ (setq list1 (butlast list1 1)
+ list2 (cons (car last-list1) list2)))))
+ match))
+
+(el-search-defpattern append (&rest patterns)
+ "Matches any list factorable into lists matched by PATTERNS in order.
+
+PATTERNS is a list of patterns P1..Pn. Match any list L for that
+lists L1..Ln exist that are matched by P1..Pn in order and L is
+equal to the concatenation of L1..Ln. Ln is allowed to be no
+list.
+
+When different ways of matching are possible, it is unspecified
+which one is chosen.
+
+Example: the pattern
+
+ (append '(1 2 3) x (app car-safe 7))
+
+matches the list (1 2 3 4 5 6 7 8 9) and binds `x' to (4 5 6)."
+ (if (null patterns)
+ '(pred null)
+ (pcase-let ((`(,pattern . ,more-patterns) patterns))
+ (cond
+ ((null more-patterns) pattern)
+ ((null (cdr more-patterns))
+ `(and (pred listp)
+ (app ,(apply-partially #'el-search--split
+ (el-search--matcher pattern)
+ (el-search--matcher (car more-patterns)))
+ (,'\` ((,'\, ,pattern)
+ (,'\, ,(car more-patterns)))))))
+ (t `(append ,pattern (append ,@more-patterns)))))))
+
(el-search-defpattern string (&rest regexps)
"Matches any string that is matched by all REGEXPS."
(el-search--check-pattern-args 'string regexps #'stringp)
- [elpa] externals/el-search 9463ad2 025/332: arrange we can use `call-interactively' when coming from isearch, (continued)
- [elpa] externals/el-search 9463ad2 025/332: arrange we can use `call-interactively' when coming from isearch, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 29c34cc 027/332: remove not so useful message of how to repeat search, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 816e675 033/332: document el-search--do-subsexps, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 1bbf5d9 035/332: give feedback in the echo area again, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 93079f5 042/332: el-search: bump version to 0.1, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 112612e 041/332: simplify el-search-hl-post-command-fun, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search b4abe87 045/332: add a to do, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 20f670a 048/332: bump version to 0.1.1, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search bff759c 047/332: el-search-query-replace: add s (toggle splicing) and ? (help) keys, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 0e71413 049/332: el-search--matcher: refine when to warn or error, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search aa4bd02 051/332: el-search: new pattern type `append',
Stefan Monnier <=
- [elpa] externals/el-search d97f8fe 052/332: remove example using `message' in a guard, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search e81afef 054/332: factor out `el-search--search-pattern-1', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 2b4c194 055/332: remove annoying message on how to repeat el-search, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 30fef15 056/332: use more newlines in `el-search--make-docstring', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search c090afe 057/332: el-search: new pattern type `contains', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 7e13746 058/332: When coming from isearch, don't move to other end, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 5837187 059/332: el-search: bump version to 0.1.3, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 108466e 061/332: Support highlighting of all visible matches, Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 177d82e 063/332: use uninterned symbol in `el-search--matcher', Stefan Monnier, 2020/12/01
- [elpa] externals/el-search 5517384 065/332: Improve doc of el-search-this-expression-identifier., Stefan Monnier, 2020/12/01