commit 3c4aeef1cc179135155fc4292dd7282c64a30ca2 Author: soup Date: Tue May 14 22:54:13 2024 -0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5e3385c --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "stilts" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..f36477e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "stilts" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..da9c8d3 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,52 @@ +pub struct OutOfSpace; +pub trait Push { + fn push(&mut self, value: T) { + let _ = self.push_checked(value); + } + + fn push_checked(&mut self, value: T) -> Result<(), OutOfSpace> { + self.push(value); + + Ok(()) + } +} + +impl Push for () { + fn push(&mut self, _: T) { + } +} + +impl Push for Vec { + fn push(&mut self, value: T) { + self.push(value) + } +} + +impl Push for Option { + fn push(&mut self, value: T) { + *self = Some(value); + } + + fn push_checked(&mut self, value: T) -> Result<(), OutOfSpace> { + match self { + Some(_) => Err(OutOfSpace), + None => { + self.push(value); + Ok(()) + }, + } + } +} + +impl<'a, R, T> Push for &'a mut R +where + R: Push, +{ + fn push(&mut self, value: T) { + (**self).push(value) + } + + fn push_checked(&mut self, value: T) -> Result<(), OutOfSpace> { + (**self).push_checked(value) + } +}