use std::marker::PhantomData; use std::cmp::Ordering; type Id<'id> = PhantomData<::std::cell::Cell<&'id mut ()>>; struct Named<'id, T>(T, Id<'id>); fn name(t: T, f: F) -> Out where F: for<'id> FnOnce(Named<'id, T>) -> Out { f(Named(t, PhantomData)) } struct SortedBy<'id, T>(T, Id<'id>); fn sort_by<'id, T, F: FnMut(&T, &T) -> Ordering>(comp: Named<'id, F>, mut list: Vec) -> SortedBy<'id, Vec> { list.sort_by(comp.0); SortedBy(list, PhantomData) } fn main() { let initial_vec = vec![3, 2, 1]; let abc = name(i32::cmp, move |func| {sort_by(func, initial_vec).0}); println!("Sorted: {:?}", abc); }