***Map

Map applies a function to every element in an array, and stores the result in
another array.

This common code:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100];
for (new i = 0; i != 100; ++i)
{
	output[i] = input[i] * 42;
}
[/pawn]

Can be written as:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100];
inline const Times42(x) @return x * 42;
Map(using inline Times42, input, output);
[/pawn]

Note: "return" can be using inside inline functions, but will sometimes give
warnings.  "@return" can always be used instead.

This can be shrunk even further with the use of the new "lambda" functions:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100];
Map({_0 * 42}, input, output);
[/pawn]

***Lambda Functions

Lambda functions are very simple inline functions that can appear inside a
function call, instead of being declared separately.  These are a little awkward
to use.  For one thing, this works:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100],
	ret = Map(using inline Whatever, input, output);
[/pawn]

This doesn't:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100],
	ret = Map({_0 - 8}, input, output);
[/pawn]

You have to write:

[pawn]
new
	input[100] = {0, 1, ...},
	output[100],
	ret;
Map({_0 - 8}, input, output) => ret;
[/pawn]

I know this is awkward, but I borrowed syntax already established by Slice in
his [url=http://forum.sa-mp.com/showthread.php?t=343172][u]multidimensional sort include[/u][/url].

The parameters have names "_0", "_1", "_2" etc.  "Map" takes a function that
requires one parameter, so you can only use "_0" in its lambda.  "ZipWith3" on
the other hand takes an inline function with 3 parameters, so you can use "_1"
and "_2" as well.

An example of a "Sum" function would be:

[pawn]
Sum(arr[], len = sizeof (arr))
{
	FoldR({_0 + _1}, arr, 0, len) => return;
}
[/pawn]

Using "return" instead of a variable is acceptable, not much else is though.

Functions (look them up somewhere):

Map - See above.
Map_ - Doesn't save the results, useful for just printing all the values.
IdxMap - Like map, but with an extra "index" parameter first in the inline.
IdxMap_ - To IdxMap what Map_ is to Map.
ZipWith - Combine two arrays using a function.
ZipWith_ - Don't store the results (Map_ with 2 function parameters).
ZipWith3 - ZipWith could be called "ZipWith2".
ZipWith3_ - 3 parameter Map_.
FoldL - Left fold.
FoldL1 - Left fold with no default value.
FoldR - Right fold.
Foldr1 - Right fold with no default value.
ScanL - Left fold, saving interim results.
ScanR - Right fold, saving interim results.
And - Returns true if every array item is true.
Or - Returns true if any array item is true.
All - Returns true if every array item passes a single parameter test.
Any - Returns true if any array item passes a single parameter test.
Reverse - Reverse the items in an array.
Elem - Returns true if "n" is in an array.
NotElem - ...


