Zond
Zond is crate with standard rust collections but with collecting statistics.
Ok, maybe it contains only analogue of [Vec] - [zvec::ZVec]. And ok, ZVec contains only some part of Vec methods.
But I made this just for fun. I don't know anyone who would really need this.
Example
Let's start from constructing collection.
Constructors similar to their std analogues' constructors but have additional argument - struct [Zond] with two fields:
zond_handlerof type [ZondHandler].
Trait object with single method that consumes two arguments:idas [usize] andoperationsas [Operations]. All operations handling is hapeppening here: you can save them to file or database, send to your server or just print to console.policyof type [Policy].
Desribes the rules about when collected operations will handled byzond_handler.
So at first let's implement some ZondHandler. It will just print operations to stdout:
;
Next let's construct Zond with HandlerImpl handler and such a policy that operations will be handled after each three method calls.
It will handle operations for ZVec:
let zond: = new;
Next let's construct ZVec with zond variable:
let mut zvec: = new;
Finally let's execute some operations:
zvec.push;
zvec.push;
zvec.push;
zvec.push;
zvec.extend_from_within;
zvec.dedup;
drop;
The console output will look like this:
0 collected
Instant { /* */ }: New
Instant { /* */ }: Push { value: 1 }
Instant { /* */ }: Push { value: 2 }
0 collected
Instant { /* */ }: Push { value: 5 }
Instant { /* */ }: Push { value: 5 }
Instant { /* */ }: ExtendFromWithin { src_start_bound: Included(1), src_end_bound: Unbounded }
0 collected
Instant { /* */ }: Dedup
As you can see, operations always being handled when dropping.