#![allow(dead_code)] use std::{cell::Cell, future::Future}; #[derive(Default)] pub struct Once { done: Cell, } impl Once { pub fn set(&self) -> bool { !self.done.replace(true) } pub fn exec(&self, f: F) { if !self.done.replace(true) { f(); } } pub async fn exec_async, F: FnOnce() -> G>(&self, f: F) { if !self.done.replace(true) { f().await; } } }