From 4c6511a058fc88f75beba8316eb32a3b1388bf41 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Mon, 4 Apr 2016 11:13:11 -0700 Subject: [PATCH] sequences.extras: make rotate! support negative indices. --- extra/sequences/extras/extras-tests.factor | 2 +- extra/sequences/extras/extras.factor | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index dfdc2837f9..c1de93f076 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -79,7 +79,7 @@ IN: sequences.extras.tests { "hello" } [ "hello" dup 0 rotate! ] unit-test { "lohel" } [ "hello" dup 3 rotate! ] unit-test -[ "hello" dup -1 rotate! ] must-fail +{ "ohell" } [ "hello" dup -1 rotate! ] unit-test { { } } [ { } [ ] map-concat ] unit-test { V{ 0 0 1 0 1 2 } } [ 4 iota [ iota ] map-concat ] unit-test diff --git a/extra/sequences/extras/extras.factor b/extra/sequences/extras/extras.factor index b37ca03bd5..ec9b5c0bb5 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -196,13 +196,14 @@ ERROR: slices-don't-touch slice1 slice2 ; ] if ; : rotate ( seq n -- seq' ) - dup 0 > [ cut ] [ abs cut* ] if prepend ; + dup 0 >= [ cut ] [ abs cut* ] if prepend ; :: rotate! ( seq n -- ) - n seq bounds-check length :> end - 0 n [ 2dup = ] [ + seq length :> len + n dup 0 < [ len + ] when seq bounds-check drop 0 over + [ 2dup = ] [ [ seq exchange-unsafe ] [ [ 1 + ] bi@ ] 2bi - dup end = [ drop over ] when + dup len = [ drop over ] when 2over = [ -rot nip over ] when ] until 3drop ; -- 2.34.1