File tree Expand file tree Collapse file tree 2 files changed +99
-0
lines changed Expand file tree Collapse file tree 2 files changed +99
-0
lines changed Original file line number Diff line number Diff line change
1
+ #![ feature( async_closure, noop_waker) ]
2
+
3
+ use std:: future:: Future ;
4
+ use std:: pin:: pin;
5
+ use std:: task:: * ;
6
+
7
+ pub fn block_on < T > ( fut : impl Future < Output = T > ) -> T {
8
+ let mut fut = pin ! ( fut) ;
9
+ let ctx = & mut Context :: from_waker ( Waker :: noop ( ) ) ;
10
+
11
+ loop {
12
+ match fut. as_mut ( ) . poll ( ctx) {
13
+ Poll :: Pending => { }
14
+ Poll :: Ready ( t) => break t,
15
+ }
16
+ }
17
+ }
18
+
19
+ fn main ( ) {
20
+ block_on ( async_main ( ) ) ;
21
+ }
22
+
23
+ async fn call < T > ( f : & impl async Fn ( ) -> T ) -> T {
24
+ f ( ) . await
25
+ }
26
+
27
+ async fn call_once < T > ( f : impl async FnOnce ( ) -> T ) -> T {
28
+ f ( ) . await
29
+ }
30
+
31
+ #[ derive( Debug ) ]
32
+ #[ allow( unused) ]
33
+ struct Hello ( i32 ) ;
34
+
35
+ async fn async_main ( ) {
36
+ // Capture something by-ref
37
+ {
38
+ let x = Hello ( 0 ) ;
39
+ let c = async || {
40
+ println ! ( "{x:?}" ) ;
41
+ } ;
42
+ call ( & c) . await ;
43
+ call_once ( c) . await ;
44
+
45
+ let x = & Hello ( 1 ) ;
46
+ let c = async || {
47
+ println ! ( "{x:?}" ) ;
48
+ } ;
49
+ call ( & c) . await ;
50
+ call_once ( c) . await ;
51
+ }
52
+
53
+ // Capture something and consume it (force to `AsyncFnOnce`)
54
+ {
55
+ let x = Hello ( 2 ) ;
56
+ let c = async || {
57
+ println ! ( "{x:?}" ) ;
58
+ drop ( x) ;
59
+ } ;
60
+ call_once ( c) . await ;
61
+ }
62
+
63
+ // Capture something with `move`, don't consume it
64
+ {
65
+ let x = Hello ( 3 ) ;
66
+ let c = async move || {
67
+ println ! ( "{x:?}" ) ;
68
+ } ;
69
+ call ( & c) . await ;
70
+ call_once ( c) . await ;
71
+
72
+ let x = & Hello ( 4 ) ;
73
+ let c = async move || {
74
+ println ! ( "{x:?}" ) ;
75
+ } ;
76
+ call ( & c) . await ;
77
+ call_once ( c) . await ;
78
+ }
79
+
80
+ // Capture something with `move`, also consume it (so `AsyncFnOnce`)
81
+ {
82
+ let x = Hello ( 5 ) ;
83
+ let c = async move || {
84
+ println ! ( "{x:?}" ) ;
85
+ drop ( x) ;
86
+ } ;
87
+ call_once ( c) . await ;
88
+ }
89
+ }
Original file line number Diff line number Diff line change
1
+ Hello(0)
2
+ Hello(0)
3
+ Hello(1)
4
+ Hello(1)
5
+ Hello(2)
6
+ Hello(3)
7
+ Hello(3)
8
+ Hello(4)
9
+ Hello(4)
10
+ Hello(5)
You can’t perform that action at this time.
0 commit comments