summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib.c39
-rw-r--r--lib.h3
2 files changed, 42 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);
diff --git a/lib.h b/lib.h
index 507be6c9..913e1814 100644
--- a/lib.h
+++ b/lib.h
@@ -379,6 +379,7 @@ typedef struct seq_iter {
cnum len;
} ul;
int (*get)(struct seq_iter *, val *pval);
+ int (*peek)(struct seq_iter *, val *pval);
} seq_iter_t;
extern const seq_kind_t seq_kind_tab[MAXTYPE+1];
@@ -533,6 +534,8 @@ seq_info_t seq_info(val cobj);
void seq_iter_init(val self, seq_iter_t *it, val obj);
void seq_iter_rewind(val self, seq_iter_t *it);
INLINE int seq_get(seq_iter_t *it, val *pval) { return it->get(it, pval); }
+INLINE int seq_peek(seq_iter_t *it, val *pval) { return it->peek(it, pval); }
+val seq_geti(seq_iter_t *it);
val seq_begin(val obj);
val seq_next(val iter, val end_val);
val seq_reset(val iter, val obj);