We've thought of generic implementations, but these in my experience have (at least) two significant challenges: (1) pagination is generally different across APIs; there are some common patterns, for sure, but no one-size-fits-all implementation that I know of, and (2) most existing abstraction layers out there don't necessarily define incremental streams or parent-child relationships very well.
So, while a generic tap might be difficult, the above challenges are handled in a generic way in our Tap and Target SDKs (
sdk.meltano.com). Sometimes a tap can be built with <100 lines of code, plus the streams' schema definitions.