[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 03e0363 7/7: el-search: new pattern type `contains'
From: |
Michael Heerdegen |
Subject: |
[elpa] master 03e0363 7/7: el-search: new pattern type `contains' |
Date: |
Thu, 31 Dec 2015 21:43:10 +0000 |
branch: master
commit 03e03636e9f1b9497db731f875bf5ebcc11ce337
Author: Michael Heerdegen <address@hidden>
Commit: Michael Heerdegen <address@hidden>
el-search: new pattern type `contains'
---
packages/el-search/el-search.el | 28 ++++++++++++++++++++++++++++
1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/packages/el-search/el-search.el b/packages/el-search/el-search.el
index 496285b..ff24166 100644
--- a/packages/el-search/el-search.el
+++ b/packages/el-search/el-search.el
@@ -571,6 +571,34 @@ matches the list (1 2 3 4 5 6 7 8 9) and binds `x' to (4 5
6)."
`(and (pred symbolp)
(app symbol-name (string ,@regexps))))
+(defun el-search--contains-p (matcher exp)
+ "Return non-nil when tree EXP contains a match for MATCHER.
+Recurse on all types of sequences. In the positive case the
+return value is (t elt), where ELT is a matching element found in
+EXP."
+ (if (el-search--match-p matcher exp)
+ (list t exp)
+ (and (sequencep exp)
+ (let ((try-match (apply-partially #'el-search--contains-p matcher)))
+ (if (consp exp)
+ (or (funcall try-match (car exp))
+ (funcall try-match (cdr exp)))
+ (cl-some try-match exp))))))
+
+(el-search-defpattern contains (&rest patterns)
+ "Matches trees that contain a match for all PATTERNs.
+Searches any tree of sequences recursively for matches. Objects
+of any kind matched by all PATTERNs are also matched.
+
+ Example: (contains (string \"H\") 17) matches ((\"Hallo\") x (5 [1 17]))"
+ (cond
+ ((null patterns) '_)
+ ((null (cdr patterns))
+ (let ((pattern (car patterns)))
+ `(app ,(apply-partially #'el-search--contains-p (el-search--matcher
pattern))
+ (,'\` (t (,'\, ,pattern))))))
+ (t `(and ,@(mapcar (lambda (pattern) `(contains ,pattern)) patterns)))))
+
(el-search-defpattern not (pattern)
"Matches any object that is not matched by PATTERN."
`(app ,(apply-partially #'el-search--match-p (el-search--matcher pattern))
- [elpa] master updated (ef4a542 -> 03e0363), Michael Heerdegen, 2015/12/31
- [elpa] master 35bab25 1/7: el-search: new pattern type `append', Michael Heerdegen, 2015/12/31
- [elpa] master 59010d0 2/7: remove example using `message' in a guard, Michael Heerdegen, 2015/12/31
- [elpa] master 1e85298 3/7: el-search: new pattern type `not', Michael Heerdegen, 2015/12/31
- [elpa] master 40208f0 5/7: remove annoying message on how to repeat el-search, Michael Heerdegen, 2015/12/31
- [elpa] master d5f798c 4/7: factor out `el-search--search-pattern-1', Michael Heerdegen, 2015/12/31
- [elpa] master 477e17c 6/7: use more newlines in `el-search--make-docstring', Michael Heerdegen, 2015/12/31
- [elpa] master 03e0363 7/7: el-search: new pattern type `contains',
Michael Heerdegen <=