aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2022-03-17 20:28:48 +0100
committerHugo Hörnquist <hugo@lysator.liu.se>2022-08-18 16:38:37 +0200
commit907931e62d154564089a2e88145d56afa68231fa (patch)
tree67a27bdc54b34a815eee12b76ceedf71c3c61e06
parentUp-prioritize api change for group-by. (diff)
downloadcalp-c-parser.tar.gz
calp-c-parser.tar.xz
Add uniq family of procedures.c-parser
-rw-r--r--doc/ref/guile/util.texi12
-rw-r--r--module/hnh/util.scm19
-rw-r--r--scripts/module-introspection.scm15
-rw-r--r--tests/test/util.scm7
4 files changed, 39 insertions, 14 deletions
diff --git a/doc/ref/guile/util.texi b/doc/ref/guile/util.texi
index b5cce99a..f7cfe438 100644
--- a/doc/ref/guile/util.texi
+++ b/doc/ref/guile/util.texi
@@ -322,6 +322,18 @@ non-unique keys, returning all mathing records (instead of just the first).
@end defun
+@defun uniq lst
+@defunx univ lst
+@defunx unique lst
+Sequeeze repeated elements in the input, similar to uniq(1).
+Matches the semantics of @code{eq?}, @code{eqv?}, and @code{equal?}.
+@end defun
+
+@defun uniqx = lst
+Uniq, but takes a custom comparison procedure.
+@end defun
+
+
@defun vector-last v
Returns the last element of @var{v}.
@end defun
diff --git a/module/hnh/util.scm b/module/hnh/util.scm
index 7509fc86..d5923e79 100644
--- a/module/hnh/util.scm
+++ b/module/hnh/util.scm
@@ -58,6 +58,11 @@
assq-ref-all
assv-ref-all
+ uniq
+ univ
+ uniqv
+ unique
+
vector-last
->string
@@ -543,6 +548,20 @@
(define (assv-ref-all alist key) (ass%-ref-all alist key eqv?))
+(define (unique% = lst)
+ (cond ((null? lst) lst)
+ ((null? (cdr lst)) lst)
+ ((and (pair? lst)
+ (= (car lst) (cadr lst)))
+ (uniq (cons (car lst) (cddr lst))))
+ (else (cons (car lst)
+ (uniq (cdr lst))))))
+
+(define (uniq lst) (unique% eq? lst))
+(define (uniqv lst) (unique% eqv? lst))
+(define univ uniqv)
+(define (unique lst) (unique% equal? lst))
+
(define (vector-last v)
diff --git a/scripts/module-introspection.scm b/scripts/module-introspection.scm
index dc430d8a..17068371 100644
--- a/scripts/module-introspection.scm
+++ b/scripts/module-introspection.scm
@@ -2,7 +2,6 @@
:use-module (srfi srfi-1)
:use-module (hnh util)
:export (get-forms
- uniq
unique-symbols
find-module-declaration
module-declaration?
@@ -16,23 +15,11 @@
done
(loop (cons form done))))))
-
-(define (uniq lst)
- (cond ((null? lst) lst)
- ((null? (cdr lst)) lst)
- ((and (pair? lst)
- (eqv? (car lst) (cadr lst)))
- (uniq (cons (car lst) (cddr lst))))
- (else (cons (car lst)
- (uniq (cdr lst))))))
-
-
(define (unique-symbols tree)
- (uniq
+ (univ
(sort* (filter symbol? (flatten tree))
string<? symbol->string)))
-
(define (module-declaration? form)
(cond ((null? form) #f)
((not (pair? form)) #f)
diff --git a/tests/test/util.scm b/tests/test/util.scm
index 5e2aab4e..f87ed3c4 100644
--- a/tests/test/util.scm
+++ b/tests/test/util.scm
@@ -139,6 +139,13 @@
(test-equal "assq-ref-all" '(1 3) (assq-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
(test-equal "assv-ref-all "'(1 3) (assv-ref-all '((a . 1) (b . 2) (a . 3)) 'a))
+
+(test-group "Unique family"
+ (test-equal
+ '(a b c b)
+ (uniq '(a b b c b b))))
+
+
(test-equal "vector-last"
1 (vector-last #(0 2 3 1)))