让
case class Box(x: Int, y: Int, z: Int)
case class Boxes(s: Set[Box])
和
val m = Boxes(Set(Box(1,2,3), Box(2,3,4), Box(3,4,5)))
下面的DSL允许指定Box
在Boxes
上收集的字段的约束,例如,
m x (>,1)
res: Boxes = Boxes(Set(Box(2,3,4), Box(3,4,5)))
m y (>=,4)
res: Boxes = Boxes(Set(Box(3,4,5)))
DSL,
abstract class Ord
case object >= extends Ord
case object > extends Ord
case class Constraints(xs: Boxes) {
def x(o: Ord, i: Int) = o match {
case >= => Boxes( xs.s.filter(_.x >= i) )
case > => Boxes( xs.s.filter(_.x > i) )
}
def y(o: Ord, j: Int) = o match {
case >= => Boxes( xs.s.filter(_.y >= j) )
case > => Boxes( xs.s.filter(_.y > j) )
}
}
implicit def b2c(m: Boxes) = Constraints(m)
查询,
Constraints
可以针对其他Ord
和/或Box
维度进行更大的扩展吗?可以实现以下语法
m x> 1