windows-rs icon indicating copy to clipboard operation
windows-rs copied to clipboard

Support closures as delegates

Open kennykerr opened this issue 5 years ago • 5 comments

Rust/WinRT doesn't yet automatically bind a lambda/closure to a delegate parameter. Today you need to create the delegate yourself. It looks something like this:

list.current_item_changed(TypedEventHandler::new(|_sender, _args| {
    // do stuff here
    Ok(())
}))?;

In the future you should be able to write simply:

list.current_item_changed(|_sender, _args| {
    // do stuff here
    Ok(())
})?;

The difficulty is in somehow specializing the winrt::Param generic for delegates to automatically create a WinRT delegate as needed while still supporting delegate objects for pass-through.

Alternatively, we could just use FnMut as the generic param for delegates. That would probably provide the best experience in most cases, but would suffer from "over-wrapping" delegate objects that are merely being passed through.

kennykerr avatar Sep 30 '20 16:09 kennykerr

This might not be possible to do since conceptually we need to ensure methods which take delegates are generic over some type which is either a delegate which takes some type that implements FnMut or another type which also implements the same FnMut trait. I believe this would require higher-kinded types since the generic delegate type is itself generic over some type.

rylev avatar Oct 02 '20 12:10 rylev

Challenge accepted. 🤜

kennykerr avatar Oct 02 '20 15:10 kennykerr

Given that passing a closure is by far the most common scenario, we could make that the default and provide a XxxWithDelegate "overload" for when you absolutely must pass an existing delegate object.

kennykerr avatar Jul 29 '22 00:07 kennykerr