Мне дали Java API для подключения и связи через проприетарную шину в стиле обратного вызова. В настоящее время я реализую приложение для проверки концепции в Scala и пытаюсь понять, как создать немного более идиоматический интерфейс Scala.
Типичное (упрощенное) приложение может выглядеть примерно так в Java:
DataType type = new DataType();
BusConnector con = new BusConnector();
con.waitForData(type.getClass()).addListener(new IListener<DataType>() {
public void onEvent(DataType t) {
//some stuff happens in here, and then we need some more data
con.waitForData(anotherType.getClass()).addListener(new IListener<anotherType>() {
public void onEvent(anotherType t) {
//we do more stuff in here, and so on
}
});
}
});
//now we've got the behaviours set up we call
con.start();
В scala я, очевидно, могу определить неявное преобразование из (T => Unit) в IListener, что, безусловно, делает вещи немного проще для чтения:
implicit def func2Ilistener[T](f: (T => Unit)) : IListener[T] = new IListener[T]{
def onEvent(t:T) = f
}
val con = new BusConnector
con.waitForData(DataType.getClass).addListener( (d:DataType) => {
//some stuff, then another wait for stuff
con.waitForData(OtherType.getClass).addListener( (o:OtherType) => {
//etc
})
})
Это напомнило мне как обещания скалаза, так и рабочие процессы f # async.
Мой вопрос такой:
Могу ли я преобразовать это либо в «для понимания», либо во что-то подобное идиоматическое (я чувствую, что это также должно довольно неплохо отображаться на актеров)
В идеале я бы хотел увидеть что-то вроде:
for(
d <- con.waitForData(DataType.getClass);
val _ = doSomethingWith(d);
o <- con.waitForData(OtherType.getClass)
//etc
)