static constexpr I sum_helper(I m, I n) { if (m == n) return m; // 0 == m < n else if (0 == m) return n * (n+1) / 2; // 0 < m < n else if (0 < m) return sum_helper(0, n) - sum_helper(0, m-1); // m < 0 <= n else if (0 <= n) return sum_helper(0, n) - sum_helper(0, -m); // m < n < 0 else return -sum_helper(-n, -m); }
static constexpr auto apply(range<T, from, to> const&) { return integral_c<T, from == to ? 0 : sum_helper(from, to-1)>; }
static int sum_helper(list_t list, int sum) { if (list_isEmpty(list)) return sum; return sum_helper(list_rest(list), sum + list_first(list)); }
int sum(list_t list) { return sum_helper(list, 0); }