From 4663bb3b6feeb2bdbe18391336b5b7dd2ededf5e Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 15 Apr 2022 10:37:03 -0700 Subject: cons: iota: document, test, improve. --- cppawk-include/cons-priv.h | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) (limited to 'cppawk-include/cons-priv.h') 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) -- cgit v1.2.3