cata f = c where c = f . fmap c . project {- c = cata f -} = f . fmap (cata f) . project
cata collapses the value: it expands one layer of the functor ( project ), recursively collapses the internal values ββ( fmap (cata f) ), and then destroys it all.
prepro ef = c where c = f . fmap (c . cata (embed . e)) . project {- c = prepro ef -} = f . fmap (prepro ef . cata (embed . e)) . project
prepro also collapses the value, but it also applies e (the natural Base t ~> Base t transformation), as it does. Note that cata embed means id (except that it can include, for example, [Int] in Fix (ListF Int) ), since it collapses the functor levels, inserting them back into the output value:

cata (embed . e) pretty similar, except that it transforms each functor layer as it passes. Since e is a natural transformation, it cannot look into everything inside the layers when they fall; he can only reorganize the structure of the layer (this includes shuffling the inner layers around for so long if he is not actually looking at the inner layers).
So back to prepro ef . It collapses the value, first tearing off the outer layer, then βrewritingβ the inner layers with e , recursively collapsing the inner values, and then collapsing it all. Note that since prepro itself has recursion, the deeper the layer is inside the value, the more it overwrites e .
Demonstration
#!/usr/bin/env stack -- stack --resolver lts-9.14 script {-
source share