diff --git a/goof/iterators.scm b/goof/iterators.scm index 4fff15f..2b227c3 100644 --- a/goof/iterators.scm +++ b/goof/iterators.scm @@ -126,12 +126,35 @@ (define-syntax in-type (syntax-rules () ((in-type seq next . rest) - (%in-idx >= (lambda (x i) (+ i 1)) (lambda (x) 0) length ref tmp seq next . rest)))) + (%in-idx >= (lambda (x i) (+ i 1)) (lambda (x) 0) length ref tmp seq next . rest)) + ((_ coll) + (in-indexed-generator coll length ref)))) (define-syntax in-type-reverse (syntax-rules () ((in-type-reverse seq next . rest) - (%in-idx < (lambda (x i) (- i 1)) (lambda (x) (- (length x) 1)) (lambda (x) 0) ref tmp seq next . rest)))) - )))) + (%in-idx < + (lambda (x i) (- i 1)) + (lambda (x) (- (length x) 1)) + (lambda (x) 0) ref tmp seq next . rest)) + ((_ coll) + (in-indexed-generator-reverse coll length ref)))))))) + +(define (in-indexed-generator coll len ref) + (let ((index -1) + (length (len coll))) + (lambda () + (set! index (+ index 1)) + (if (>= index length) + (eof-object) + (ref coll index))))) + +(define (in-indexed-generator-reverse coll len ref) + (let ((index (len coll))) + (lambda () + (set! index (- index 1)) + (if (< index 0) + (eof-object) + (ref coll index))))) (define-in-indexed in-vector in-vector-reverse vector-length vector-ref) @@ -291,7 +314,9 @@ ((not (pair? cursor))) ((bindings (car cursor))) () - . rest)))) + . rest)) + ((_ hash-expr) + (in-list (hash-map->list cons hash-expr))))) (define-syntax accumulating