// --------------------------------------------------------------------------------
// simplified (inlining operators)
// --------------------------------------------------------------------------------

typedef int factk (int);

int
ret_cps (int n)
{
  return n;
}

#if 0

// step one: inline eq_cps
int
factcps (int n, factk k)
{
  int factcps_2 (int nm1) {
    int factcps_3 (int f) {
      return mul_cps (n, f, k);
    }
    return factcps (nm1, factcps_3);
  }
  if (n == 0) {
    return k (1);
  } else {
    return minus_cps (n, 1, factcps_2);
  }
}

// step two: inline minus_cps
int
factcps (int n, factk k)
{
  int factcps_3 (int f) {
    return mul_cps (n, f, k);
  }
  if (n == 0) {
    return k (1);
  } else {
    return factcps (n-1, factcps_3);
  }
}

#endif

// step three: inline mul_cps
int
factcps (int n, factk k)
{
  int factcps_3 (int f) {
    return k (n * f);
  }
  if (n == 0) {
    return k (1);
  } else {
    return factcps (n-1, factcps_3);
  }
}

#include <stdio.h>
int
main (int argc, char * argv[])
{
  int result = factcps (5, ret_cps);
  fprintf (stdout, "factcps(5)==%d\n", result);
  return 0;
}