Advertisement
mwchase

Today in "Stupid Rust Tricks"

Aug 30th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 0.65 KB | None | 0 0
  1. use std::marker::PhantomData;
  2. use std::cmp::Ordering;
  3.  
  4. type Id<'id> = PhantomData<::std::cell::Cell<&'id mut ()>>;
  5.  
  6. struct Named<'id, T>(T, Id<'id>);
  7.  
  8. fn name<T, F, Out>(t: T, f: F) -> Out where F: for<'id> FnOnce(Named<'id, T>) -> Out {
  9.     f(Named(t, PhantomData))
  10. }
  11.  
  12. struct SortedBy<'id, T>(T, Id<'id>);
  13.  
  14. fn sort_by<'id, T, F: FnMut(&T, &T) -> Ordering>(comp: Named<'id, F>, mut list: Vec<T>) -> SortedBy<'id, Vec<T>> {
  15.    list.sort_by(comp.0);
  16.    SortedBy(list, PhantomData)
  17. }
  18.  
  19. fn main() {
  20.    let initial_vec = vec![3, 2, 1];
  21.    let abc = name(i32::cmp, move |func| {sort_by(func, initial_vec).0});
  22.    println!("Sorted: {:?}", abc);
  23. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement