Initial commit
This commit is contained in:
commit
3c4aeef1cc
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/target
|
||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -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"
|
||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "stilts"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
52
src/lib.rs
Normal file
52
src/lib.rs
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
pub struct OutOfSpace;
|
||||
pub trait Push<T> {
|
||||
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<T> Push<T> for () {
|
||||
fn push(&mut self, _: T) {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Push<T> for Vec<T> {
|
||||
fn push(&mut self, value: T) {
|
||||
self.push(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Push<T> for Option<T> {
|
||||
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<T> for &'a mut R
|
||||
where
|
||||
R: Push<T>,
|
||||
{
|
||||
fn push(&mut self, value: T) {
|
||||
(**self).push(value)
|
||||
}
|
||||
|
||||
fn push_checked(&mut self, value: T) -> Result<(), OutOfSpace> {
|
||||
(**self).push_checked(value)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue