diff --git a/basis/circular/circular-docs.factor b/basis/circular/circular-docs.factor index 2b4c083399..93d137d626 100644 --- a/basis/circular/circular-docs.factor +++ b/basis/circular/circular-docs.factor @@ -50,7 +50,7 @@ HELP: rotate-circular HELP: circular-while { $values - { "sequence" sequence } + { "circular" circular } { "quot" quotation } } { $description "Calls " { $snippet "quot" } " on each element of the sequence until each call yields " { $link f } " in succession." } ; diff --git a/basis/circular/circular.factor b/basis/circular/circular.factor index 67ddd3467b..58951f64c8 100644 --- a/basis/circular/circular.factor +++ b/basis/circular/circular.factor @@ -59,27 +59,21 @@ PRIVATE> TUPLE: circular-iterator { circular read-only } { n integer } { last-start integer } ; -: ( sequence -- obj ) - 0 0 circular-iterator boa ; inline +: ( circular -- obj ) + 0 0 circular-iterator boa ; inline > ] [ circular>> ] bi nth ] dip call ] 2keep rot [ - [ - [ 1 + ] change-n - dup n>> >>last-start - ] dip (circular-while) + [ [ [ n>> ] [ circular>> ] bi nth ] dip call ] 2keep + rot [ [ dup n>> >>last-start ] dip ] when + over [ n>> ] [ [ last-start>> ] [ circular>> length ] bi + 1 - ] bi = [ + 2drop ] [ - over [ 1 + ] change-n - [ n>> ] [ [ last-start>> ] [ circular>> length ] bi + ] bi = [ - 2drop - ] [ - (circular-while) - ] if + [ [ 1 + ] change-n ] dip (circular-while) ] if ; inline recursive PRIVATE> -: circular-while ( sequence quot: ( obj -- ? ) -- ) - [ ] dip (circular-while) ; inline +: circular-while ( circular quot: ( obj -- ? ) -- ) + [ clone ] dip [ ] dip (circular-while) ; inline