diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-06-12 06:46:45 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-06-12 06:46:45 -0700 |
commit | 2fe27a3760606616a9b859a145cb1b358cfa415a (patch) | |
tree | cc9c8f980dd74cd0afe0be091017a5f4cc5580a0 /lib.c | |
parent | c54df81f05e622bd3ce6daa0bc4ba5d3999f958d (diff) | |
download | txr-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.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -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); |