https://devhubby.com/thread/how-do-you-determine-if-a-type-is-a-functor-or-not