]> gitweb.factorcode.org Git - factor.git/commitdiff
Add a few words
authorKeldan Chapman <keldan.chapman@gmail.com>
Mon, 9 Jan 2023 22:15:05 +0000 (09:15 +1100)
committerJohn Benediktsson <mrjbq7@gmail.com>
Mon, 9 Jan 2023 22:23:50 +0000 (14:23 -0800)
extra/generators/generators-docs.factor
extra/generators/generators-tests.factor
extra/generators/generators.factor

index 3d80e58491290d070b60e8269399d97edbf646db..4bb1c8b435ad2b66b0dc9138c7bed245ca57403e 100644 (file)
@@ -45,6 +45,12 @@ HELP: catch-stop-generator
 }
 { $description "Attempts to run the " { $snippet try } " quotation. If a " { $link stop-generator } " error is thrown, then the " { $snippet except } "quotation will be run instead." } ;
 
+HELP: exhausted?
+{ $values
+    { "gen" generator } { "?" boolean }
+}
+{ $description "Check whether a generator has already been exhausted." } ;
+
 HELP: gen-coroutine
 { $values
     { "quot" quotation } { "gen" generator }
@@ -122,6 +128,12 @@ HELP: yield*
 }
 { $description "Pause computation and yield a value to the caller, with the expectation for a value to be returned before computation is resumed." } ;
 
+HELP: yield-from
+{ $values
+    { "gen" generator }
+}
+{ $description "Delegate computation to the specified generator until it is exhausted, before resuming computation in the current generator." } ;
+
 ARTICLE: "generators" "generators"
 { $vocab-link "generators" }
 ;
index e8dcfbfb3fbdebd721b4efa08755726df1bfb150..365de0165ff41e9d571e38fa8c12e614c80a9ff0 100644 (file)
@@ -44,3 +44,9 @@ GEN: next*-gen ( -- g ) 1 yield* yield* yield* ;
 
 { { 1 2 3 } } [ no-inp-gen take-all ] unit-test
 { { } } [ [ ] <generator> take-all ] unit-test
+
+GEN: yf-test ( -- g ) no-inp-gen yield-from no-inp-gen yield-from ;
+{ { 1 2 3 1 2 3 } } [ yf-test take-all ] unit-test
+
+{ t } [ no-inp-gen [ take-all drop ] [ exhausted? ] bi ] unit-test
+{ f } [ no-inp-gen exhausted? ] unit-test
index 8b652532b6239bdc12fa935ec201f03975da4c0f..e6cc451727c88f0f4004f2ce6a7c65e6e062e08d 100644 (file)
@@ -32,4 +32,8 @@ SYNTAX: GEN:: (::) [ make-gen-quot ] keep define-declared ;
 : ?next ( gen -- val/f end? ) [ next f ] [ drop f t ] catch-stop-generator ;
 : ?next* ( v gen -- val/f end? ) [ next* f ] [ 2drop f t ] catch-stop-generator ;
 : take ( gen n -- seq ) [ swap '[ drop _ ?next [ , t ] unless ] all-integers? drop ] { } make ;
-: take-all ( gen -- seq ) [ '[ _ ?next [ , t ] unless ] loop ] { } make ;
+: take-all ( gen -- seq ) '[ _ ?next not ] [ ] produce nip ;
+
+: yield-from ( gen -- ) '[ _ ?next [ drop f ] [ yield t ] if ] loop ;
+
+: exhausted? ( gen -- ? ) state>> not ;