summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-06-12 06:46:45 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-06-12 06:46:45 -0700
commit2fe27a3760606616a9b859a145cb1b358cfa415a (patch)
treecc9c8f980dd74cd0afe0be091017a5f4cc5580a0 /lib.c
parentc54df81f05e622bd3ce6daa0bc4ba5d3999f958d (diff)
downloadtxr-2fe27a3760606616a9b859a145cb1b358cfa415a.tar.gz
txr-2fe27a3760606616a9b859a145cb1b358cfa415a.tar.bz2
txr-2fe27a3760606616a9b859a145cb1b358cfa415a.zip
seq iterators: new peek operation.
* lib.c (seq_iter_peek_nil, seq_iter_peek_list, seq_iter_peek_vec, seq_iter_peek_hash): New static functions. (seq_geti): New function. (seq_iter_init): Initialize new peek member of seq_iter structure. * lib.h (struct seq_iter): New member, peek. (seq_peek): New inline function. (seq_geti): Declared.
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/lib.c b/lib.c
index 1794fa99..d9c23678 100644
--- a/lib.c
+++ b/lib.c
@@ -311,6 +311,11 @@ static int seq_iter_get_nil(seq_iter_t *it, val *pval)
return 0;
}
+static int seq_iter_peek_nil(seq_iter_t *it, val *pval)
+{
+ return 0;
+}
+
static int seq_iter_get_list(seq_iter_t *it, val *pval)
{
if (!it->ui.iter)
@@ -320,6 +325,14 @@ static int seq_iter_get_list(seq_iter_t *it, val *pval)
return 1;
}
+static int seq_iter_peek_list(seq_iter_t *it, val *pval)
+{
+ if (!it->ui.iter)
+ return 0;
+ *pval = car(it->ui.iter);
+ return 1;
+}
+
static int seq_iter_get_vec(seq_iter_t *it, val *pval)
{
if (it->ui.index < it->ul.len) {
@@ -329,12 +342,34 @@ static int seq_iter_get_vec(seq_iter_t *it, val *pval)
return 0;
}
+static int seq_iter_peek_vec(seq_iter_t *it, val *pval)
+{
+ if (it->ui.index < it->ul.len) {
+ *pval = ref(it->inf.obj, num(it->ui.index));
+ return 1;
+ }
+ return 0;
+}
+
static int seq_iter_get_hash(seq_iter_t *it, val *pval)
{
*pval = hash_next(it->ui.iter);
return *pval != nil;
}
+static int seq_iter_peek_hash(seq_iter_t *it, val *pval)
+{
+ *pval = hash_peek(it->ui.iter);
+ return *pval != nil;
+}
+
+val seq_geti(seq_iter_t *it)
+{
+ val v = nil;
+ (void) it->get(it, &v);
+ return v;
+}
+
void seq_iter_rewind(val self, seq_iter_t *it)
{
switch (it->inf.kind) {
@@ -364,21 +399,25 @@ void seq_iter_init(val self, seq_iter_t *it, val obj)
it->ui.iter = nil;
it->ul.len = 0;
it->get = seq_iter_get_nil;
+ it->peek = seq_iter_peek_nil;
break;
case SEQ_LISTLIKE:
it->ui.iter = it->inf.obj;
it->ul.len = 0;
it->get = seq_iter_get_list;
+ it->peek = seq_iter_peek_list;
break;
case SEQ_VECLIKE:
it->ui.index = 0;
it->ul.len = c_num(length(it->inf.obj));
it->get = seq_iter_get_vec;
+ it->peek = seq_iter_peek_vec;
break;
case SEQ_HASHLIKE:
it->ui.iter = hash_begin(it->inf.obj);
it->ul.len = 0;
it->get = seq_iter_get_hash;
+ it->peek = seq_iter_peek_hash;
break;
default:
unsup_obj(self, obj);