groupBy functions
BoundedEnum
every :: (Bounded a, Enum a) => [a] -- all values
cycleSucc :: (Bounded a, Enum a) => a -> a -- like succ, but doesn't fail on maxBound
safeToEnum :: Enum a => Int -> Maybe a -- Nothing if Int outside enum range
bimapF :: (Functor f, Bifunctor p) => (a -> c) -> (b -> d) -> f (p a b) -> f (p c d)
firstF :: ... similar
secondF :: ... similar
groupByfunctionsBoundedEnumBifunctor