blocking 0.4.3

Block on async code or await blocking code
Documentation
use std::io::Cursor;
use std::sync::mpsc;
use std::thread;

use blocking::{block_on, Unblock};
use futures::prelude::*;

#[test]
fn chan() {
    block_on! {
        let (s, r) = mpsc::sync_channel::<i32>(100);
        let handle = thread::spawn(move || {
            for i in 0..100_000 {
                s.send(i).unwrap();
            }
        });

        let mut r = Unblock::new(r.into_iter());
        for i in 0i32..100_000 {
            assert_eq!(r.next().await, Some(i));
        }

        handle.join().unwrap();
        assert!(r.next().await.is_none());
    }
}

#[test]
fn read() {
    block_on! {
        let mut v1 = vec![0u8; 20_000_000];
        for i in 0..v1.len() {
            v1[i] = i as u8;
        }
        let mut v1 = Unblock::new(Cursor::new(v1));

        let mut v2 = vec![];
        v1.read_to_end(&mut v2).await.unwrap();

        let v1 = v1.into_inner().await.into_inner();
        assert!(v1 == v2);
    }
}

#[test]
fn write() {
    block_on! {
        let mut v1 = vec![0u8; 20_000_000];
        for i in 0..v1.len() {
            v1[i] = i as u8;
        }

        let v2 = vec![];
        let mut v2 = Unblock::new(Cursor::new(v2));
        v2.write_all(&v1).await.unwrap();

        let v2 = v2.into_inner().await.into_inner();
        assert!(v1 == v2);
    }
}