Guest User

Untitled

a guest
Mar 22nd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. package tech
  2.  
  3. trait Mondoid[T] {
  4. def zero: T
  5. def append(a: T, b: T): T
  6. }
  7.  
  8. object Mondoid {
  9. def apply[A](implicit instance: Mondoid[A]): Mondoid[A] = instance
  10. }
  11.  
  12. package syntax {
  13.  
  14. import scalaz.Foldable
  15.  
  16. trait MondoidSyntax {
  17. implicit class MondoidOps[F[_] : Foldable, A](xs: F[A]) {
  18. def calcSum(implicit m: Mondoid[A]) = {
  19. Foldable[F].foldLeft(xs, m.zero)(m.append)
  20. }
  21. }
  22. }
  23. }
  24.  
  25. package std {
  26.  
  27. trait MondoidInstances {
  28. implicit object `Mondoid for Int` extends Mondoid[Int] {
  29. def zero = 0
  30. def append(a: Int, b: Int) = a + b
  31. }
  32.  
  33. implicit object `Mondoid for String` extends Mondoid[String] {
  34. def zero = ""
  35. def append(a: String, b: String) = a + b
  36. }
  37. }
  38. }
  39.  
  40. package all {
  41.  
  42. import tech.std.MondoidInstances
  43. import tech.syntax.MondoidSyntax
  44.  
  45. object mondoid extends MondoidInstances with MondoidSyntax
  46.  
  47. }
  48.  
  49. object TestMondoid {
  50. def main(args: Array[String]): Unit = {
  51.  
  52. import all.mondoid._
  53.  
  54. import scalaz.std.list._
  55. import scalaz.std.vector._
  56.  
  57. println(List(1, 2, 3).calcSum)
  58. println(Vector(1, 2, 3).calcSum)
  59. println(List("1", "2", "3").calcSum)
  60. println(Vector("1", "2", "3").calcSum)
  61.  
  62. implicit object `Mondoid for Boolean` extends Mondoid[Boolean] {
  63. def zero = true
  64. def append(a: Boolean, b: Boolean) = a && b
  65. }
  66. println(List(true, true, false).calcSum)
  67. println(Vector(true, true, false).calcSum)
  68. }
  69. }
Add Comment
Please, Sign In to add comment