On a call with other Rust developers, I realized that I was thinking about unique closures all wrong. I had in mind a total ordering:
fn[send] <: fn <: block
but of course this is not necessary. What is desirable is a partial ordering:
fn[send] <: block fn <: block
@ pointers can both be aliased using a reference.
Ironically, this is precisely what I proposed in my list of possible
solutions, but I did so using region terminology. Embarrassingly
obvious, in retrospect, particularly as that was Graydon’s original
design I believe. I think I got confused by the total ordering of
kinds into thinking that this should translate to a total ordering of
functions that close over data in those kinds. Anyhow, I will now
work on implementing unique closures in this partially ordered way,
and hopefully things will go more smoothly!