mwchase icon

Today in "Stupid Rust Tricks"

mwchase | PRO | 08/31/18 03:13:09 AM UTC | 0 ⭐ | 831 👁️ | Never ⏰ | []
Rust |

650 B

|

None

|

0 👍

/

0 👎

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