Here's a QAD for repositioning an item within a series.
Sample uses are
>> foo: "abcdefghijklmnop"
== "abcdefghijklmnop"
To move #"c" to the 5th position (#"d" and #"e" move left)
>> move foo 3 5
== "abdecfghijklmnop"
To undo a move, reverse the arguments
>> move foo 5 3
== "abcdefghijklmnop"
Equal arguments is a no-op
>> move foo 3 3
== "abcdefghijklmnop"
Also works with blocks (including nested blocks)
>> foo: [[this] [is a] [multi-level series]]
== [[this] [is a] [multi-level series]]
Successive uses of move ser-var length? ser-var 1 rotates left
>> move foo 3 1
== [[multi-level series] [this] [is a]]
>> move foo 3 1
== [[is a] [multi-level series] [this]]
>> move foo 3 1
== [[this] [is a] [multi-level series]]
... reverse those arguments to rotate right
>> move foo 1 length? foo
== [[is a] [multi-level series] [this]]
>> move foo 1 length? foo
== [[multi-level series] [this] [is a]]
>> move foo 1 length? foo
== [[this] [is a] [multi-level series]]
Have fun!
-jn-
=====================================
REBOL [
Title: "In-Series Move"
Date: 31-Jan-1999
Author: "Joel Neely"
File: %move.r
Email: [EMAIL PROTECTED]
Purpose: {
To move an item from one (relative) position to another
within a series. Only positive positions relative to
current series index are supported.
}
]
move: function [
{Move item around within series (positive pos only!)}
s [series!] {series value}
oldpos [integer!] {item pos pre move}
newpos [integer!] {item pos post move}
][
indx item
][
either all [
0 < oldpos oldpos <= length? s
0 < newpos newpos <= length? s
][
indx: index? s
s: at s oldpos
item: s/1
remove s
s: at s (newpos - oldpos + either newpos > oldpos [1][0])
insert/only s item
s: at head s indx
][
s
]
]