Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.52 KB | None | 0 0
  1. package ru.tinkoff.travel.utils
  2.  
  3. import cats.{Monoid, MonoidK}
  4. import shapeless.tag
  5. import shapeless.tag.@@
  6.  
  7.  
  8. object monoids {
  9. type Endo[X] = Endo.T[X]
  10.  
  11. object Endo {
  12. abstract class Tag private()
  13. type T[X] = (X => X) @@ Tag
  14.  
  15. def apply[X](f: X => X): T[X] = tag[Tag].apply[X => X](f)
  16.  
  17. implicit val endoMonoidK = new MonoidK[T] {
  18. def empty[A]: T[A] = Endo(identity[A])
  19. def combineK[A](x: T[A], y: T[A]): T[A] = Endo(x.compose(y))
  20. }
  21.  
  22. implicit def endoMonoid[A] = endoMonoidK.algebra[A]
  23. }
  24. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement