From 1aa8a432c7dee1351e73c7f4e9d4ffbdcfc26983 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Mon, 4 Apr 2016 11:17:24 -0700 Subject: [PATCH] sequences.extras: make rotate wrap. --- extra/sequences/extras/extras-tests.factor | 6 +++++- extra/sequences/extras/extras.factor | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index c1de93f076..4016696298 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -75,11 +75,15 @@ IN: sequences.extras.tests { "hello" "hello" } [ "hello" dup 0 rotate ] unit-test { "hello" "llohe" } [ "hello" dup 2 rotate ] unit-test +{ "hello" "lohel" } [ "hello" dup 13 rotate ] unit-test { "hello" "ohell" } [ "hello" dup -1 rotate ] unit-test +{ "hello" "lohel" } [ "hello" dup -12 rotate ] unit-test { "hello" } [ "hello" dup 0 rotate! ] unit-test -{ "lohel" } [ "hello" dup 3 rotate! ] unit-test +{ "llohe" } [ "hello" dup 2 rotate! ] unit-test +{ "lohel" } [ "hello" dup 13 rotate! ] unit-test { "ohell" } [ "hello" dup -1 rotate! ] unit-test +{ "lohel" } [ "hello" dup -12 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 ec9b5c0bb5..7c3caa7b4a 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -196,11 +196,11 @@ ERROR: slices-don't-touch slice1 slice2 ; ] if ; : rotate ( seq n -- seq' ) - dup 0 >= [ cut ] [ abs cut* ] if prepend ; + over length mod dup 0 >= [ cut ] [ abs cut* ] if prepend ; :: rotate! ( seq n -- ) seq length :> len - n dup 0 < [ len + ] when seq bounds-check drop 0 over + n len mod dup 0 < [ len + ] when seq bounds-check drop 0 over [ 2dup = ] [ [ seq exchange-unsafe ] [ [ 1 + ] bi@ ] 2bi dup len = [ drop over ] when -- 2.34.1