これは shapeless ライブラリで可能かもしれないと考えています。
shapeless を使用して匿名クラスをクロージャーに変換しています。これにはhlisted
fromFnHListerAux
トレイトの使用が必要です。
やりたいことは、渡されたダミー関数を取り除き、 と同じ型シグネチャを持つこの関数の周りにクロージャを返すことだけF
です。非同期で実行される匿名クラスがなければ、これは簡単です。これを回避する方法はありますか?
def async[F, A <: HList, R](
shell: Shell,
success: F,
failure: FunctionTypes.Failure,
dummy: F)(implicit h: FnHListerAux[F, A => R],
u: FnUnHListerAux[A => R, F]): F =
{ (args: A) =>
require(shell != null, "Shell cannot be null")
require(shell.getDisplay() != null, "The shell must have a display")
val display = shell.getDisplay()
display.asyncExec(new Runnable() {
def run(): Unit = {
try {
success.hlisted(args)
} catch {
case e: Throwable =>
failure(e)
}
}
})
dummy.hlisted(args)
}.unhlisted