Functor package:hedgehog

A type f is a Functor if it provides a function fmap which, given any types a and b lets you apply any function from (a -> b) to turn an f a into an f b, preserving the structure of f. Furthermore f needs to adhere to the following: Note, that the second law follows from the free theorem of the type fmap and the first law, so you need only check that the former condition holds. See https://www.schoolofhaskell.com/user/edwardk/snippets/fmap or https://github.com/quchen/articles/blob/master/second_functor_law.md for an explanation.
Barbie-types that can be mapped over. Instances of FunctorB should satisfy the following laws:
bmap id = id
bmap f . bmap g = bmap (f . g)
There is a default bmap implementation for Generic types, so instances can derived automatically.