package scalaz sealed trait Endo[A] extends NewType[A => A] { def apply(a: A): A = value(a) def fix: A = apply(fix) } trait Endos { def EndoTo[A](f: A => A): Endo[A] = new Endo[A] { val value = f } def constantEndo[A](a: => A): Endo[A] = EndoTo[A](_ => a) def idEndo[A]: Endo[A] = EndoTo[A](a => a) }