Guest User

Untitled

a guest
Oct 18th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. sealed abstract class PathElement
  2. object PathElement {
  3. case class Property (name : String) extends PathElement
  4. case class Index (index: Int) extends PathElement
  5. case class Named (name : String) extends PathElement
  6. }
  7.  
  8. type Path = List[PathElement]
  9.  
  10. sealed abstract class AnyTransformerFailure
  11. object AnyTransformerFailure {
  12. case class Message (message : String) extends AnyTransformerFailure
  13. case class Exception(throwable: Throwable) extends AnyTransformerFailure
  14. }
  15.  
  16. sealed abstract class AnyTransformerTree
  17. object AnyTransformerTree {
  18. case class Empty () extends AnyTransformerTree
  19. case class Leaf (path: Path, failure: AnyTransformerFailure) extends AnyTransformerTree
  20. case class Suppress (tree: AnyTransformerTree) extends AnyTransformerTree
  21. case class Fork (left: AnyTransformerTree, right: AnyTransformerTree) extends AnyTransformerTree
  22.  
  23. val empty = Empty()
  24.  
  25. def leaf(p: Path)(f: AnyTransformerFailure) = Leaf(p, f)
  26.  
  27. def suppress(t: AnyTransformerTree) = {
  28. t match {
  29. case _ : Suppress => t
  30. case _ => Suppress(t)
  31. }
  32. }
  33.  
  34. def fork(l: AnyTransformerTree, r: AnyTransformerTree) = {
  35. (l, r) match {
  36. case (_: Empty , _ ) => r
  37. case (_ , _: Empty ) => l
  38. case (l: Suppress , r: Suppress ) => Suppress(Fork(l, r))
  39. case _ => Fork(l, r)
  40. }
  41. }
  42.  
  43. }
  44.  
  45. case class AnyTransformerResult[+A](value: A, tree: AnyTransformerTree)
  46. object AnyTransformerResult {
  47. @inline def result[A](v: A, t: AnyTransformerTree) = AnyTransformerResult[A](v, t)
  48. @inline def good [A](v: A) = result(v, AnyTransformerTree.empty)
  49. }
  50.  
  51. case class AnyTransformer[+A](f: (Any, Path) => AnyTransformerResult[A])
  52. object AnyTransformer {
  53. import AnyTransformerResult._
  54. import AnyTransformerTree._
  55.  
  56. // Monad
  57.  
  58. def unit[A](a: A): AnyTransformer[A] =
  59. AnyTransformer((v, p) => good(a))
  60.  
  61. def bind[A,B](a: AnyTransformer[A])(bf: A => AnyTransformer[B]): AnyTransformer[B] =
  62. AnyTransformer((v, p) => {
  63. val ar = a.f(v, p)
  64. val b = bf(ar.value)
  65. val br = b.f(v, p)
  66. result(br.value, fork(ar.tree, br.tree))
  67. })
  68.  
  69.  
  70. // Applicative
  71.  
  72. def ap[A,B](f: AnyTransformer[A => B])(a: AnyTransformer[A]): AnyTransformer[B] =
  73. AnyTransformer((v, p) => {
  74. val fr = f.f(v, p)
  75. val ar = a.f(v, p)
  76. result(fr.value(ar.value), fork(fr.tree, ar.tree))
  77. })
  78.  
  79. // Functor
  80.  
  81. def map[A,B](m: A => B)(a: AnyTransformer[A]): AnyTransformer[B] =
  82. AnyTransformer((v, p) => {
  83. val ar = a.f(v, p)
  84. result(m(ar.value), ar.tree)
  85. })
  86.  
  87.  
  88. }
  89.  
  90.  
  91. object Main extends App {
  92. println("Hello")
  93. }
Add Comment
Please, Sign In to add comment