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, F, Out>(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<T>) -> SortedBy<'id, Vec<T>> {
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);
}
Comments