@@ -59,12 +59,12 @@ impl ExampleLifecycle {
59
59
pub fn on_update (
60
60
& self ,
61
61
context : HandlerContext < ExampleAgent > ,
62
- map : & HashMap < u64 , String > ,
62
+ _map : & HashMap < u64 , String > ,
63
63
key : u64 ,
64
64
_prev : Option < String > ,
65
65
_new_value : & str ,
66
66
) -> impl EventHandler < ExampleAgent > {
67
- self . policy . on_event ( context, key, map . clone ( ) )
67
+ self . policy . on_event ( context, key)
68
68
}
69
69
}
70
70
@@ -74,6 +74,7 @@ impl ExampleLifecycle {
74
74
pub enum RetentionPolicy {
75
75
Count {
76
76
max : usize ,
77
+ keys : RefCell < VecDeque < u64 > > ,
77
78
} ,
78
79
Time {
79
80
interval : u64 ,
@@ -84,7 +85,10 @@ pub enum RetentionPolicy {
84
85
impl RetentionPolicy {
85
86
#[ allow( dead_code) ]
86
87
pub fn count ( max : usize ) -> RetentionPolicy {
87
- RetentionPolicy :: Count { max }
88
+ RetentionPolicy :: Count {
89
+ max,
90
+ keys : RefCell :: new ( Default :: default ( ) ) ,
91
+ }
88
92
}
89
93
90
94
#[ allow( dead_code) ]
@@ -99,16 +103,19 @@ impl RetentionPolicy {
99
103
& self ,
100
104
context : HandlerContext < ExampleAgent > ,
101
105
key : u64 ,
102
- map : HashMap < u64 , String > ,
103
106
) -> impl EventHandler < ExampleAgent > {
104
107
match self {
105
- RetentionPolicy :: Count { max } => {
106
- let drop = map. len ( ) . checked_sub ( * max) . unwrap_or_default ( ) ;
108
+ RetentionPolicy :: Count { max, keys } => {
109
+ let timestamps = & mut * keys. borrow_mut ( ) ;
110
+ timestamps. push_front ( key) ;
111
+
112
+ let drop = timestamps. len ( ) . checked_sub ( * max) . unwrap_or_default ( ) ;
107
113
let handler = if drop > 0 {
108
- let keys = map
114
+ let keys = timestamps
115
+ . split_off ( drop)
109
116
. into_iter ( )
110
117
. take ( drop)
111
- . map ( move |( key, _value ) | context. remove ( ExampleAgent :: HISTORY , key) ) ;
118
+ . map ( move |key| context. remove ( ExampleAgent :: HISTORY , key) ) ;
112
119
Some ( Sequentially :: new ( keys) )
113
120
} else {
114
121
None
0 commit comments