def fixed_point(is_zero, plus, minus, f, x):
    @memo_Y
    def _fixed_point(fixed_point_fun):
        def __fixed_point(collected, new):
            diff = minus(new, collected)
            if is_zero(diff):
                return collected
            return fixed_point_fun(plus(collected, diff), f(diff))
        return __fixed_point
    return _fixed_point(x, f(x))