diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-04-15 10:37:03 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-04-15 10:37:03 -0700 |
commit | 4663bb3b6feeb2bdbe18391336b5b7dd2ededf5e (patch) | |
tree | 0c7b84e02b468baa9d7a7c33d5eacfda2e8b5786 /cppawk-include | |
parent | 3450c06137836d4cb00d5f98d8490c85948913c0 (diff) | |
download | cppawk-4663bb3b6feeb2bdbe18391336b5b7dd2ededf5e.tar.gz cppawk-4663bb3b6feeb2bdbe18391336b5b7dd2ededf5e.tar.bz2 cppawk-4663bb3b6feeb2bdbe18391336b5b7dd2ededf5e.zip |
cons: iota: document, test, improve.
Diffstat (limited to 'cppawk-include')
-rw-r--r-- | cppawk-include/cons-priv.h | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/cppawk-include/cons-priv.h b/cppawk-include/cons-priv.h index 55790d1..97d410d 100644 --- a/cppawk-include/cons-priv.h +++ b/cppawk-include/cons-priv.h @@ -786,23 +786,43 @@ function __butlast(__lst, __n, return (__i in __circbuf) ? __list_end(__circbuf[__i]) : __nil } -function __iota(__from, __to, __step, - __i, __out) +function __iota(__from, __to, __delta, + __out, __i, __val) { __out = __list_begin(); if (__from < __to) { - if (!__present(__step)) - __step = 1 - if (__step > 0) - for (__i = __from; __i <= __to; __i += __step) - __out = __list_add(__out, __i) + if (!__present(__delta)) + __delta = 1 + + if (__delta <= 0) + return __nil; + + __i = 0 + __val = __from + + while (__val <= __to) { + __out = __list_add(__out, __val) + __i++ + __val = __from + (__i * __delta) + } + } else if (__from > __to) { + if (!__present(__delta)) + __delta = -1 + + if (__delta >= 0) + return __nil; + + __i = 0 + __val = __from + + while (__val >= __to) { + __out = __list_add(__out, __val) + __i++ + __val = __from + (__i * __delta) + } } else { - if (!__present(__step)) - __step = -1 - if (__step < 0) - for (__i = __from; __i >= __to; __i += __step) - __out = __list_add(__out, __i) + return __list(__from) } return __list_end(__out) |