Reduces left, middle and right using reduce.
reduce
T reduce<T>(T Function(L, M, R) reduce) => reduce(left, middle, right);