#include <stdlib.h>
#include <stdio.h>

typedef int(*FN_INT_MAP)(int);
int * map(FN_INT_MAP f, int n, int a[n]) {
  int * newA = malloc(sizeof(int) * n);
  for(int i = 0; i < n; i++) {
    newA[i] = f(a[i]);
  }
  return newA;
}

void print_array(int n, int a[n]) {
  printf("[");
  for(int i = 0; i < n; i++) {
    printf("%d, ", a[i]);
  }
  printf("\b\b]\n");
}

int main(int argc, char **argv) {
  printf("Hello world\n");
  int a[] = {4,5,6,7,8};
  int alen = sizeof(a) / sizeof(int);

  int counter = 0;
  int add5(int x) {
    counter++;
    return x + 5;
  }

  int * a2 = map(add5, alen, a);

  print_array(5, a2);
  printf("counter = %d\n", counter);

  return 0;
}

