1 module neton.util.Future;
2 import core.sync.condition;
3 import core.sync.mutex;
4 import hunt.logging;
5 import hunt.util.Serialize;
6 
7 class Future(Req , Res)
8 {
9 
10     Req _in;
11     Res _out;
12     Condition _condition;
13     
14     this(Req in_ )
15     {
16         _in = in_;
17         // trace("**** key : ",cast(string)(_in.key));
18         _condition = new Condition(new Mutex());
19     }
20 
21 
22     Res get()
23     {
24         _condition.mutex().lock();
25         trace("condition waiting ...");
26         _condition.wait(5.seconds);
27         trace("condition waiting done ...");
28         _condition.mutex().unlock();
29         return _out;
30     }
31 
32     void done(Res out_)
33     {
34         trace("condition notify ... ");
35         _out = out_;
36         _condition.notify();
37     }
38 
39     Req data() @property
40     {
41         return _in;
42     }
43 
44     ref Res ExtraData() @property
45     {
46         return _out;
47     }
48 
49     void setExtraData(Res res)
50     {
51         _out = res;
52     }
53 }
54 
55 
56 unittest
57 {
58     import core.thread;
59     import std.stdio;
60     auto f = new Future!(string,string)("hello");
61     new Thread((){
62         Thread.sleep(dur!"secs"(1));
63         if(f.data == "hello")
64             f.done("world");
65     }).start();
66     writeln(f.get());
67 }