@@ -41,6 +41,15 @@ impl CoinsCache {
4141 }
4242 }
4343
44+ pub fn get_all_active ( & mut self ) -> Vec < CoinTypeId > {
45+ self . remove_all_expired_entries ( ) ;
46+
47+ self . items
48+ . iter ( )
49+ . flat_map ( |( _key, entry) | entry. iter ( ) . map ( |cci| cci. id . clone ( ) ) )
50+ . collect ( )
51+ }
52+
4453 pub fn get_active ( & mut self , key : & CoinCacheKey ) -> HashSet < CoinTypeId > {
4554 self . remove_expired_entries ( key) ;
4655
@@ -76,6 +85,12 @@ impl CoinsCache {
7685 entry. retain ( |item| item. is_valid ( self . ttl ) ) ;
7786 }
7887 }
88+
89+ fn remove_all_expired_entries ( & mut self ) {
90+ for ( _key, entry) in self . items . iter_mut ( ) {
91+ entry. retain ( |item| item. is_valid ( self . ttl ) ) ;
92+ }
93+ }
7994}
8095
8196#[ derive( Eq , Debug , Clone ) ]
@@ -175,8 +190,42 @@ mod tests {
175190 assert ! ( active_coins. is_empty( ) ) ;
176191 }
177192
193+ #[ tokio:: test]
194+ async fn get_all_active ( ) {
195+ let mut cache = CoinsCache :: new ( Duration :: from_secs ( 10 ) ) ;
196+
197+ let key = CoinCacheKey :: default ( ) ;
198+ let ( item1, _) = get_items ( ) ;
199+ let items = HashMap :: from ( [ ( key. clone ( ) , vec ! [ item1. clone( ) ] ) ] ) ;
200+
201+ cache. insert_multiple ( items) ;
202+
203+ // Advance time by more than the cache's TTL
204+ tokio:: time:: pause ( ) ;
205+ tokio:: time:: advance ( Duration :: from_secs ( 12 ) ) . await ;
206+
207+ let ( _, item2) = get_items ( ) ;
208+ let items = HashMap :: from ( [ ( key. clone ( ) , vec ! [ item2. clone( ) ] ) ] ) ;
209+ cache. insert_multiple ( items) ;
210+
211+ let active_coins = cache. get_all_active ( ) ;
212+
213+ assert_eq ! ( active_coins. len( ) , 1 ) ;
214+ assert ! ( !active_coins. contains( & item1) ) ;
215+ assert ! ( active_coins. contains( & item2) ) ;
216+ }
217+
218+ #[ test]
219+ fn get_all_active_no_items ( ) {
220+ let mut cache = CoinsCache :: new ( Duration :: from_secs ( 60 ) ) ;
221+
222+ let active_coins = cache. get_all_active ( ) ;
223+
224+ assert ! ( active_coins. is_empty( ) ) ;
225+ }
226+
178227 #[ test]
179- fn test_remove_items ( ) {
228+ fn remove_items ( ) {
180229 let mut cache = CoinsCache :: new ( Duration :: from_secs ( 60 ) ) ;
181230
182231 let key: CoinCacheKey = Default :: default ( ) ;
0 commit comments