Advertisement
Guest User

Untitled

a guest
May 22nd, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.79 KB | None | 0 0
  1. case class Field[A](name: String) {
  2.   def ===(value: A): Tree[A] = Equals(this, value)
  3.   def !==(value: A): Tree[A] = NotEquals(this, value)
  4.   def <(value: A): Tree[A] = LessThan(this, value)
  5.   def >(value: A): Tree[A] = GreaterThan(this, value)
  6.   def >=(value: A): Tree[A] = GreaterOrEqual(this, value)
  7.   def <=(value: A): Tree[A] = LessOrEqual(this, value)
  8. }
  9.  
  10. sealed trait Tree[+A] {
  11.   self =>
  12.   def &&(t: Tree[_]): Tree[_] = and(t)
  13.   def and(t: Tree[_]): Tree[_] = And(self, t)
  14.   def ||(t: Tree[_]): Tree[_] = or(t)
  15.   def or(t: Tree[_]): Tree[_] = Or(self, t)
  16. }
  17. sealed trait Leaf[+A] extends Tree[A] { def field: Field[_]; def value: A }
  18. sealed trait Node[+A] extends Tree[A] { def left: Tree[_]; def right: Tree[_]}
  19. case class Or[+A](left: Tree[_], right: Tree[_]) extends Node[A]
  20. case class And[+A](left: Tree[_], right: Tree[_]) extends Node[A]
  21. case class GreaterOrEqual[A](field: Field[A], value: A) extends Leaf[A]
  22. case class GreaterThan[A](field: Field[A], value: A) extends Leaf[A]
  23. case class LessOrEqual[A](field: Field[A], value: A) extends Leaf[A]
  24. case class LessThan[A](field: Field[A], value: A) extends Leaf[A]
  25. case class Equals[A](field: Field[A], value: A) extends Leaf[A]
  26. case class NotEquals[A](field: Field[A], value: A) extends Leaf[A]
  27.  
  28. object QueryObjects {
  29.   object Test {
  30.     object name extends Field[String]("name")
  31.     object age extends Field[Int]("age")
  32.     object shoesize extends Field[Int]("shoesize")
  33.     object showsize extends Field[Int]("showsize")
  34.   }
  35. }
  36.  
  37. (Test.name === "Zandre") and (Test.age > 21) or ((Test.shoesize < 12) and (Test.showsize >= 22))
  38. ===
  39. Or(And(Equals(Field(name),Zandre),GreaterThan(Field(age),21)),And(LessThan(Field(shoesize),12),GreaterOrEqual(Field(showsize),22)))
  40.  
  41. and Test.name === 3 // gives design time error / compile time error
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement