背景
我正在使用Scala编写事件库。 在我的库中,您可以像这样定义事件:
val e1 = new ImperativeEvent[Int]
你可以像这样触发它们:
e1(42)
您可以像这样创建反应:
val r1 = (i: Int) => println(i)
将它们附加到事件上,就像这样:
e1 += r1
除了事件转换、组合等其他内容外,我使用Esper CEP引擎作为我的库的后端。 Esper在大多数操作中使用类似SQL的语言称为EPL。
问题
我正在尝试实现一些更高级的概念,例如事件连接。因此,现在您可以像这样定义具有多个属性的事件(使用元组类型):
val e2 = new ImperativeEvent[(Int, String)]
然后像这样加入它们:
val e3 = e1 join e2 windowLength (30) on "E1.P1 = E2.P1"
该语句对e1和e2进行联接,条件是它们各自的第一个属性相等,并且只考虑它们在最后30次出现时的情况。
这样做没问题,但我想去掉实现中的字符串,以使事件表达式可以进行类型检查。我想将联接表达式更改为以下内容:
val e3 = e1 join e2 windowLength (30) on e1._1 === e2._1
类似于在Squeryl中所做的方式。问题在于,我无法访问元组类型的元素类型......
问题
如何静态访问元组类型?目前我只能通过反射在运行时访问它们,这对我没有帮助。我相信使用元组无法实现我的目标,但我想知道是否使用shapeless库中的HLists或类似的东西可以帮助实现我的目标。
e1.join(e2).windowLength(30).on(e1._1 === e2._1)
。===
是什么意思? - pedrofurlajoin
方法将它们替换为适当的内部事件 ID。实际的连接是由 Esper(http://esper.codehaus.org/)完成的,我的库主要是它的包装器。Esper 基于一种名为 EPL 的类 SQL 语言,因此它使用字符串。我想为这些字符串添加类型检查(类似于 Squeryl,这就是我的===
示例来自的地方),但我不确定是否可以在当前事件表示法中实现(其中参数表示为事件的元组类型)。 - Mark Goldenstein+=
运算符的想法是从 C# 借鉴而来的。点击这里 快速了解 C# 事件。 - Mark GoldensteinregisterHandler
的方法,那每次我都会使用它。 - itsbruce