From 3c4aeef1cc179135155fc4292dd7282c64a30ca2 Mon Sep 17 00:00:00 2001 From: soup Date: Tue, 14 May 2024 22:54:13 -0400 Subject: [PATCH] Initial commit --- .gitignore | 1 + Cargo.lock | 7 +++++++ Cargo.toml | 6 ++++++ src/lib.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/lib.rs 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) + } +}