diff --git a/lib/allocator/src/freelist.rs b/lib/allocator/src/freelist.rs index ed63acb..304ae2d 100644 --- a/lib/allocator/src/freelist.rs +++ b/lib/allocator/src/freelist.rs @@ -119,7 +119,7 @@ impl FreeList { pub fn reserve(&mut self, start: PhysAddr, size: usize) { // NOTE: only support inclusive range if let Some((region, _)) = - self.alloc_node(|region| (region.start_addr() <= start && start < region.end_addr()).some(|| (), ())) + self.alloc_node(|region| (region.start_addr() <= start && start < region.end_addr()).then_ok((), ())) { let region_start = region.start_addr(); let region_end = region.end_addr(); diff --git a/lib/utils/src/then.rs b/lib/utils/src/then.rs index c51cfd7..a02e842 100644 --- a/lib/utils/src/then.rs +++ b/lib/utils/src/then.rs @@ -1,22 +1,42 @@ pub trait Then { - fn and Result>(self, f: F, err: E) -> Result; - fn some T>(self, f: F, err: E) -> Result; + fn then_ok(self, ok: T, err: E) -> Result; + fn then_err(self, ok: T, err: E) -> Result; + fn else_ok(self, ok: T, err: E) -> Result; + fn else_err(self, ok: T, err: E) -> Result; } impl Then for bool { #[inline] - fn and Result>(self, f: F, err: E) -> Result { + fn then_ok(self, ok: T, err: E) -> Result { if self { - f() + Ok(ok) } else { Err(err) } } #[inline] - fn some T>(self, f: F, err: E) -> Result { + fn then_err(self, ok: T, err: E) -> Result { + if !self { + Ok(ok) + } else { + Err(err) + } + } + + #[inline] + fn else_ok(self, ok: T, err: E) -> Result { + if !self { + Ok(ok) + } else { + Err(err) + } + } + + #[inline] + fn else_err(self, ok: T, err: E) -> Result { if self { - Ok(f()) + Ok(ok) } else { Err(err) }