diff options
-rw-r--r-- | gtwiwtg.lisp | 30 | ||||
-rw-r--r-- | package.lisp | 1 |
2 files changed, 24 insertions, 7 deletions
diff --git a/gtwiwtg.lisp b/gtwiwtg.lisp index 202063a..c273680 100644 --- a/gtwiwtg.lisp +++ b/gtwiwtg.lisp @@ -96,15 +96,15 @@ the values passed as ARGS looped forever." (values (random arg) nil)))) -(defun from-thunk (thunk &optional times) - "Creates a generator that produces an inifinte series of values that -are the return value of (FUNCALL THUNK) -If TIMES is supplied, THUNK will only be called TIMES times." - (let ((thunk-proxy (lambda (ignore) (declare (ignore ignore)) (funcall thunk)))) - (map! thunk-proxy (range :to (when times (1- times)))))) -(defun from-thunk-until (thunk until) +(defun from-thunk-until (thunk &optional (until (constantly nil))) + "Creates a generator that produces a series of value by successively +calling (FUNCALL THUNK). The iterator stops whenever (FUNCALL UNTIL) +is non null. + +By default, UNTIL is the function (CONSTANTLY NIL). I.e. it will +generate forever." (make-instance 'generator! :state nil :next-p-fn (lambda (ignore) (declare (ignore ignore)) (not (funcall until))) @@ -112,6 +112,22 @@ If TIMES is supplied, THUNK will only be called TIMES times." (declare (ignore ignore)) (values (funcall thunk) nil)))) + +(defun from-thunk (thunk) + "Creates a generator that produces an inifinte series of values that +are the return value of (FUNCALL THUNK). + +If you need to create a stopping condition on your thunk-backed +generator, see FROM-THUNK-UNTIL." + (from-thunk-until thunk)) + + +(defun from-thunk-times (thunk times) + "Creates a generator that produces its values by calling + (FUNCALL THUNK) exactly TIMES times." + (let ((thunk-proxy (lambda (ignore) (declare (ignore ignore)) (funcall thunk)))) + (map! thunk-proxy (times times)))) + (defun from-recurrence (rec n-1 &rest n-m) "Creates a generator from a recurrence relation. diff --git a/package.lisp b/package.lisp index ec55c79..964b785 100644 --- a/package.lisp +++ b/package.lisp @@ -9,6 +9,7 @@ #:noise #:from-thunk #:from-thunk-until + #:from-thunk-times #:from-recurrence #:from-input-stream #:file-lines |