From 476781cdd9db7f3e1902df14164229e790c30058 Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Tue, 24 Apr 2012 16:59:17 -0700 Subject: [PATCH] sequences.extras: adding rotate and rotate! words. --- extra/sequences/extras/extras-tests.factor | 5 +++++ extra/sequences/extras/extras.factor | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/extra/sequences/extras/extras-tests.factor b/extra/sequences/extras/extras-tests.factor index 968f827997..ec7d9ec17f 100644 --- a/extra/sequences/extras/extras-tests.factor +++ b/extra/sequences/extras/extras-tests.factor @@ -49,3 +49,8 @@ IN: sequences.extras.tests { { "hello," " " "world!" " " " " } } [ "hello, world! " [ blank? ] slice-when [ >string ] map ] unit-test + +{ "hello" } [ "hello" 0 rotate ] unit-test +{ "llohe" } [ "hello" 2 rotate ] unit-test +{ "hello" } [ "hello" dup 0 rotate! ] unit-test +{ "lohel" } [ "hello" dup 3 rotate! ] unit-test diff --git a/extra/sequences/extras/extras.factor b/extra/sequences/extras/extras.factor index eac2f5236a..323a4c076f 100644 --- a/extra/sequences/extras/extras.factor +++ b/extra/sequences/extras/extras.factor @@ -103,3 +103,14 @@ IN: sequences.extras [ 2dup = [ 1 + ] when ] [ len ] if* [ seq ] keep len or swap ] produce nip ; inline + +: rotate ( seq n -- seq' ) + cut prepend ; + +:: rotate! ( seq n -- ) + seq length :> end + n 0 n [ 2dup = ] [ + [ seq exchange ] [ [ 1 + ] bi@ ] 2bi + dup end = [ drop over ] when + 2over = [ -rot nip over ] when + ] until 3drop ;