[][src]Crate enclose

A convenient macro for cloning values into a closure.

Use

use enclose::enclose;

fn main() {
    let clone_data = 0;
    let add_data = 100;
    my_enclose( enclose!((mut clone_data, add_data) move || {
        println!("#0 {:?}", clone_data);
        clone_data += add_data;
        println!("#1 {:?}", clone_data);
        
        assert_eq!(clone_data, 100);
    }));
    
    assert_eq!(clone_data, 0);
}

fn my_enclose<F: FnOnce() -> R, R>(a: F) -> R {
    a()
}

Use 1

use std::sync::Arc;
use std::sync::Mutex;
use std::thread;

use enclose::enclose;

fn main() {
    let mutex_data = Arc::new(Mutex::new( 0 ));
    let thread = thread::spawn( enclose!((mutex_data => data) move || {
        let mut lock = match data.lock() {
            Ok(a) => a,
            Err(e) => e.into_inner(),
        };
        *lock += 1;
    }));

    thread.join().unwrap();
    {
        let lock = match mutex_data.lock() {
            Ok(a) => a,
            Err(e) => e.into_inner(),
        };
        assert_eq!(*lock, 1);
    }
}

Use 2

use std::thread;
use std::sync::Arc;
use std::sync::Mutex;
use std::sync::RwLock;

use enclose::enclose;


let v = Arc::new(Mutex::new( 0 ));
let v2 = Arc::new(RwLock::new( (0, 2, 3, 4) ));

let count_thread = 5;
let mut wait_all = Vec::with_capacity(count_thread);

for _a in 0..count_thread {
    wait_all.push({
        thread::spawn( enclose!((v, v2) move || {
            let mut v_lock = match v.lock() {
                Ok(a) => a,
                Err(e) => e.into_inner(),
            };
            *v_lock += 1;

            drop( v2 ); //ignore warning
        }))
    });
}
for a in wait_all {
    a.join().unwrap();
}
{	
    //Test result
    let v_lock = match v.lock() {
        Ok(a) => a,
        Err(e) => e.into_inner(),
    };
    assert_eq!(*v_lock, 5);
}

Use 3

use std::sync::Arc;
use std::sync::Mutex;
use std::thread;

use enclose::enclose;

let v = Arc::new(Mutex::new( 0 ));
let thread = thread::spawn( enclose!((v => MY_LOCKER) move || {
    let mut v_lock = match MY_LOCKER.lock() {
        Ok(a) => a,
        Err(e) => e.into_inner(),
    };
    *v_lock += 1;
 }));

thread.join().unwrap();
{
    let v_lock = match v.lock() {
        Ok(a) => a,
        Err(e) => e.into_inner(),
    };
    assert_eq!(*v_lock, 1);
}

Macros

enc

Macro for cloning values to close. Alternative short record.

enclose

Macro for cloning values to close.