Select Git revision
ecc-pm1-redc.c
Forked from
Nettle / nettle
Source project has a limited visibility.
-
Niels Möller authoredNiels Möller authored
Array.pmod 2.70 KiB
#define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )
mixed map(mixed arr, mixed fun, mixed ... args)
{
int e;
mixed *ret;
if(mappingp(arr))
return mkmapping(indices(arr),map(values(arr),fun,@args));
switch(sprintf("%t",fun))
{
case "int":
return arr(@args);
case "string":
return column(arr, fun)(@args);
case "function":
case "program":
case "object":
ret=allocate(sizeof(arr));
for(e=0;e<sizeof(arr);e++)
ret[e]=fun(arr[e],@args);
return ret;
default:
error("Bad argument 2 to map_array().\n");
}
}
mixed filter(mixed arr, mixed fun, mixed ... args)
{
int e;
mixed *ret;
if(mappingp(arr))
{
mixed *i, *v, r;
i=indices(arr);
ret=map(v=values(arr),fun,@args);
r=([]);
for(e=0;e<sizeof(ret);e++) if(ret[e]) r[i[e]]=v[e];
return ret;
}else{
int d;
ret=map(arr,fun,@args);
for(e=0;e<sizeof(arr);e++) if(ret[e]) ret[d++]=arr[e];
return ret[..d-1];
}
}
int search_array(mixed *arr, mixed fun, mixed ... args)
{
int e;
if(stringp(fun))
{
for(e=0;e<sizeof(arr);e++)
if(arr[e][fun](@args))
return e;
return -1;
}
else if(functionp(fun))
{
for(e=0;e<sizeof(arr);e++)
if(fun(arr[e],@args))