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
    ]
]

Reply via email to