«Расплющивание» массива

Дан массив:

const arr = [1, [2, [3, [4,5]]]]

Необходимо написать функцию, которая принимает в аргументах многомерный массив неограниченной вложенности и возвращает одномерный массив, состоящий из элементов со всех уровней вложенности исходного массива.

Примеры:

flat([1, [2, [3, [4,5]]]]); // => [1, 2, 3, 4, 5]
flat([1, [2, [3, [4,5,[6,[7]]]]]]); // => [1, 2, 3, 4, 5, 6, 7]