closed + associative
foldMap is the same as .map().reduce()
Reader: Similar idea to Dependency injection
Endo: Same input and output types
contramap: transform the input before it passing to the function
contramap: apply transform function on input arguements
reducer: Modelling the reducer pattern
Endo + Fn = Reducer:
// (acc, a) -> acc
// (a, acc) -> acc
// a -> acc -> acc
// a -> (acc -> acc)
// a -> Endo(acc -> acc)
// Fn(a -> Endo(acc -> acc))