summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-11-15 19:17:45 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-11-15 19:17:45 -0800
commit269f576bf44e02dc78eb84bdef4f5fdb677ea041 (patch)
tree7c8a6f58b32cfcbb5f4eaeb798500d6908c35445 /lib.c
parenta661a3989bd7865ad990c72ff2202f6cb6eef34a (diff)
downloadtxr-269f576bf44e02dc78eb84bdef4f5fdb677ea041.tar.gz
txr-269f576bf44e02dc78eb84bdef4f5fdb677ea041.tar.bz2
txr-269f576bf44e02dc78eb84bdef4f5fdb677ea041.zip
posq, posql, posqual, rposq, rposql, rposqual: rewrite
* lib.c (posq, posql, posqual, rposq, rposql, rposqual): These functions are reduced to wrappers around pos and rpos, respectively, so they generalize properly and efficiently to sequences of all kinds.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c123
1 files changed, 30 insertions, 93 deletions
diff --git a/lib.c b/lib.c
index c8704705..7ec6b1b2 100644
--- a/lib.c
+++ b/lib.c
@@ -8708,99 +8708,6 @@ val rfind_if(val predi, val seq, val key)
return found;
}
-val posqual(val obj, val list)
-{
- val pos = zero;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (equal(car(list), obj))
- return pos;
-
- return nil;
-}
-
-val rposqual(val obj, val list)
-{
- val pos = zero;
- val found = nil;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (equal(car(list), obj))
- found = pos;
-
- return found;
-}
-
-val posql(val obj, val list)
-{
- val pos = zero;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (eql(car(list), obj))
- return pos;
-
- return nil;
-}
-
-val rposql(val obj, val list)
-{
- val pos = zero;
- val found = nil;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (eql(car(list), obj))
- pos = found;
-
- return pos;
-}
-
-val posq(val obj, val list)
-{
- val pos = zero;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (car(list) == obj)
- return pos;
-
- return nil;
-}
-
-val rposq(val obj, val list)
-{
- val pos = zero;
- val found = nil;
-
- list = nullify(list);
-
- gc_hint(list);
-
- for (; list; list = cdr(list), pos = plus(pos, one))
- if (car(list) == obj)
- found = pos;
-
- return found;
-}
-
val pos(val item, val seq, val testfun, val keyfun)
{
testfun = default_arg(testfun, equal_f);
@@ -8921,6 +8828,36 @@ val rpos(val item, val seq, val testfun, val keyfun)
}
}
+val posqual(val obj, val list)
+{
+ return pos(obj, list, equal_f, identity_f);
+}
+
+val rposqual(val obj, val list)
+{
+ return rpos(obj, list, equal_f, identity_f);
+}
+
+val posql(val obj, val list)
+{
+ return pos(obj, list, eql_f, identity_f);
+}
+
+val rposql(val obj, val list)
+{
+ return rpos(obj, list, eql_f, identity_f);
+}
+
+val posq(val obj, val list)
+{
+ return pos(obj, list, eq_f, identity_f);
+}
+
+val rposq(val obj, val list)
+{
+ return rpos(obj, list, eq_f, identity_f);
+}
+
val pos_if(val pred, val list, val key)
{
val pos = zero;