aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/slsh/lib/arrayfuns.sl
blob: 17d9a49fc74f80d5c984afffd20641adb01eeae5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
%!%+
%\function{reverse}
%\synopsis{Reverse the elements of a 1-d array}
%\usage{Array_Type reverse (Array_Type A)}
%\description
% The \slfun{reverse} function reverses the elements of a 1-d array and
% returns the result.
%\seealso{shift}
%!%-
public define reverse (a)
{
   variable i = length (a);
   if (i <= 1)
     return a;
   
   i--;
   __tmp(a)[[i:0:-1]];
}


%!%+
%\function{shift}
%\synopsis{Shift the elements of a 1-d array}
%\usage{Array_Type shift (Array_Type A, Int_Type n)}
%\description
% The \slfun{shift} function shifts the elements of an array by a specified amount
% and returns the result.  If \exmp{n} is positive, the ith element of the array
% will be shifted to the position \exmp{i-n} of the array.  Elements for 
% which \exmp{i-n} is less than 0 will be moved to the end of the array.
%\example
%#v+
%   A = [1,2,3,4,5,6,7,8,9];
%   B = shift (A, 3);          % ==> B = [4,5,6,7,8,9,1,2,3];
%   C = shift (A, -1);         % ==> C = [9,1,2,3,4,5,6,7,8];
%#v-
%\notes
% It many ways \exmp{rotate} would be a better name for this function.
%\seealso{reverse, transpose}
%!%-
public define shift (x, n)
{
   variable len = length(x);
   variable i = [0:len-1];
   
   % allow n to be negative and large
   n = len + n mod len;
   return x[(i + n)mod len];
}

provide ("arrayfuns");