Merge sort, runs in your browser console.
((f, g) => a => g(f, g, a))
(
(f => (l, r) => f(f, l, r, [], 0, 0))
((f, l, r, a, i, j) =>
i < l.length && j < r.length ?
(a.push(l[i] < r[j] ? l[i++] : r[j++]),
f(f, l, r, a, i, j)) :
(a.splice(a.length, 0, ...l.slice(i)),
a.splice(a.length, 0, ...r.slice(j)),
a)
),
(f, g, a) => a.length < 2 ? a :
f(g(f, g, a.slice(0, a.length / 2)), g(f, g, a.slice(a.length / 2)))
)
([5, 6, 2, 3, 7, 1, 0, 4])