diff options
author | Colin Okay <cbeok@protonmail.com> | 2020-07-11 23:03:56 -0500 |
---|---|---|
committer | Colin Okay <cbeok@protonmail.com> | 2020-07-11 23:03:56 -0500 |
commit | c168b35f2cf2e176c032ab09309ebcd5614d9f84 (patch) | |
tree | 127f07b1a9a8ece2af7413e026fd5776a51f81ad | |
parent | 714da6989c8c849695f4b1033bfd7f58d36f8241 (diff) | |
parent | 4f0acd1f8774a8604793b30d12ae374953e9e095 (diff) |
Merge branch 'master' of github.com:cbeo/gtwiwtg into experiments
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | gtwiwtg.lisp | 21 |
2 files changed, 17 insertions, 6 deletions
@@ -21,7 +21,7 @@ docstring. Many docstrings include examples of use. ``` -## First, Here's the Action +## First, Some Action Here are a few examples to show you what you can do. A more involved example apears at the end of the document, following the tutorial. diff --git a/gtwiwtg.lisp b/gtwiwtg.lisp index ac846bd..00534f5 100644 --- a/gtwiwtg.lisp +++ b/gtwiwtg.lisp @@ -60,10 +60,10 @@ ;;; Generator Classes ;;; (a-generator-class range-backed-generator! () - (at 0) to (by 1) inclusive (comparator #'<)) + (at 0) to (by 1) (comparator #'<)) (defmethod has-next-p ((g range-backed-generator!)) - (with-slots (to current comparator by at) g + (with-slots (to comparator by at) g (or (not to) (funcall comparator (+ by at) @@ -162,7 +162,6 @@ If TO is NIL, then the generator produces an infinite sequence. (if inclusive #'>= #'>)))) (make-instance 'range-backed-generator! :comparator comparator - :inclusive inclusive :at (- from by) :to to :by by))) @@ -183,7 +182,7 @@ of the sequence." :sequence sequence :index (1- start)))) -(defun from-thunk-until (thunk &optional (until (constantly nil)) clean-up) +(defun from-thunk-until (thunk &key (until (constantly nil)) clean-up) "Creates a generator that produces a series of value by successively calling (FUNCALL THUNK). The iterator stops whenever (FUNCALL UNTIL) is non null. @@ -375,8 +374,10 @@ Error Conditions: (from-thunk-until (lambda () (apply map-fn (mapcar #'next all-gens))) + :until (lambda () (some (complement #'has-next-p) all-gens)) ; when at least one has no next value + :clean-up (lambda () (dolist (g all-gens) (stop g)))))) @@ -391,6 +392,8 @@ Error Condition: (let (on-deck) (from-thunk-until (lambda () on-deck) ; consumers always call has-next-p before next + + :until (lambda () (loop :while (has-next-p gen) @@ -400,6 +403,8 @@ Error Condition: (setf on-deck candidate) (return nil)) ; Don't stop generating, we found one :finally (return t))) ; Stop generating, we can't find one. + + :clean-up (lambda () (stop gen))))) @@ -435,6 +440,7 @@ Error Conditions: (from-thunk-until (lambda () (next sub-gen)) + :until (lambda () (loop :until (has-next-p sub-gen) @@ -447,7 +453,8 @@ Error Conditions: ;; hence: (not (or (has-next-p sub-gen) (has-next-p gen)))) - + + :clean-up (lambda () (stop gen) (when sub-gen (stop sub-gen))))))) @@ -510,9 +517,11 @@ Error Conditions: all-gens))) (car vals))) + :until (lambda () (null all-gens)) + :clean-up (lambda () (dolist (g all-gens) (stop g)))))) @@ -591,10 +600,12 @@ Caveat: (t (error "Attempted to get next from a spent generator.")))) + :until (lambda () (and (not (has-next-p source-generator)) (queue-empty-p local-q))) + :clean-up (lambda () (setf (car local-stop) t) (when (every #'car stop-cells) |