Now let's take a silly one
1

Configure Feed

Select the types of activity you want to include in your feed.

at main 1.3 kB View raw
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}