Очень похоже на generate_previous. Видимо, можно дедуплицировать, передав функцию в качестве аргумента