>>4Y DA FUK WUD U WANNA DO FUNCTIONAL PROGRAMMING IN A PROCEDURAL LANGUAGE?
O WELL. HEREZ MY SOLUTION 4 MAP, FOLD, N FILTER:
#include <stdio.h>
#include <string.h>
size_t map(void *p, size_t n, size_t size, int fn(void *, void *), void *arg)
{
unsigned char *bp;
size_t i, j;
bp = p;
for (i = j = 0; i < n; i++)
if (fn(&bp[i * size], arg) == 0)
memcpy(&bp[j++ * size], &bp[i * size], size);
return j;
}
int add(void *val, void *accum)
{
*(int *) accum += *(int *) val;
return 1;
}
int add1(void *val, void *unused)
{
++*(int *) val;
return 1;
}
int print(void *val, void *unused)
{
printf(" %d", *(int *) val);
return 1;
}
int even(void *val, void *unused)
{
return *(int *) val % 2 == 0;
}
int main(void)
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
size_t n = sizeof a / sizeof a[0];
int x;
/* map example: add 1 to each element */
map(a, n, sizeof a[0], add1, NULL);
/* filter example: filter even numbers */
n = map(a, n, sizeof a[0], even, NULL);
/* for-each example: print each element */
map(a, n, sizeof a[0], print, NULL);
printf("\n");
/* fold example: sum elements */
x = 0;
map(a, n, sizeof a[0], add, &x);
printf("%d\n", x);
return 0;
}