Now let's take a silly one
1use std::sync::atomic::{AtomicU8, Ordering};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum Coverage {
5 Warming,
6 Ready,
7}
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum Resolved<T> {
11 Warming,
12 Ready(T),
13}
14
15impl<T> Resolved<T> {
16 pub fn is_warming(&self) -> bool {
17 matches!(self, Resolved::Warming)
18 }
19
20 pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Resolved<U> {
21 match self {
22 Resolved::Ready(value) => Resolved::Ready(f(value)),
23 Resolved::Warming => Resolved::Warming,
24 }
25 }
26}
27
28const WARMING: u8 = 0;
29const READY: u8 = 1;
30
31#[derive(Debug)]
32pub(crate) struct CoverageCell(AtomicU8);
33
34impl CoverageCell {
35 pub(crate) fn new(initial: Coverage) -> Self {
36 Self(AtomicU8::new(encode(initial)))
37 }
38
39 pub(crate) fn get(&self) -> Coverage {
40 decode(self.0.load(Ordering::Acquire))
41 }
42
43 pub(crate) fn set(&self, coverage: Coverage) {
44 self.0.store(encode(coverage), Ordering::Release);
45 }
46}
47
48fn encode(coverage: Coverage) -> u8 {
49 match coverage {
50 Coverage::Warming => WARMING,
51 Coverage::Ready => READY,
52 }
53}
54
55fn decode(raw: u8) -> Coverage {
56 match raw {
57 READY => Coverage::Ready,
58 _ => Coverage::Warming,
59 }
60}