The Comonad type-class is the dual of Monad. Whereas Monads
allow for the composition of effectful functions, Comonads allow
for composition of functions that extract the value from their
To implement Comonad:
The purpose of this type-class is to support the data-types in the
Monix library and it is considered a shim for a lawful type-class
to be supplied by libraries such as Cats or Scalaz or equivalent.
CREDITS: The type-class encoding has been inspired by the Scato
project by Aloïs Cochard and Scalaz 8
and the type has been extracted from Cats.