1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//! # looper
//!
//! 基于rust实现的消息事件循环系统。
//!
//! - looper模块负责用户消息的插入;
//! - handler模块负责处理用户消息;
//!
//! ## 基本原理
//!
//! looper模块将用户的所有消息,按照UNIX时间顺序,插入到链表中;
//! handler模块从链表中,取出已经到时间的消息进行处理。
//!
//! ## 示例
//!
//! ```
//! use rooper::{Looper, LooperMsg};
//!
//! struct ExMsg {
//!     val: i32,
//! }
//!
//! impl LooperMsg for ExMsg {
//!     fn handle_message(self) {
//!         println!("msg val: {}", self.val);
//!     }
//! }
//!
//! fn main() {
//!     let mut lp = Looper::new();
//!     lp.send_msg_delay(ExMsg {val: 4}, std::time::Duration::from_millis(400));
//!     lp.send_msg_delay(ExMsg {val: 3}, std::time::Duration::from_millis(600));
//!     lp.send_msg_delay(ExMsg {val: 2}, std::time::Duration::from_millis(800));
//!     lp.send_msg_delay(ExMsg {val: 1}, std::time::Duration::from_millis(1000));
//!     lp.send_msg_delay(ExMsg {val: 5}, std::time::Duration::from_millis(200));
//!
//!     std::thread::sleep(std::time::Duration::from_secs(2));
//!     lp.terminate();
//! }
//!
//! ```
//!

#![feature(linked_list_cursors)]

mod looper;
mod handler;
pub use looper::{Looper, LooperMsg};


#[cfg(test)]
mod tests {
    use super::{Looper, LooperMsg};

    static mut CNT: i32 = 0;
    static mut VAL: Vec<i32> = Vec::new();
    struct ExMsg { val: i32 }

    impl LooperMsg for ExMsg {
        fn handle_message(self) {
            println!("msg val: {}", self.val);
            // looper中各个消息不会同时执行,故不用加锁
            unsafe {
                CNT += 1;
                VAL.push(self.val);
            }
        }
    }

    #[test]
    fn it_works() {
        let mut lp = Looper::new();
        lp.send_msg_delay(ExMsg {val: 4}, std::time::Duration::from_millis(400));
        lp.send_msg_delay(ExMsg {val: 2}, std::time::Duration::from_millis(800));
        lp.send_msg_delay(ExMsg {val: 3}, std::time::Duration::from_millis(600));
        lp.send_msg_delay(ExMsg {val: 1}, std::time::Duration::from_millis(1000));
        lp.send_msg_delay(ExMsg {val: 5}, std::time::Duration::from_millis(200));
        std::thread::sleep(std::time::Duration::from_secs(2));
        lp.terminate();

        unsafe {
            assert_eq!(CNT, 5);
            assert_eq!(VAL, vec![5, 4, 3, 2, 1]);
        }
    }

}