diff --git a/sewup/src/kv/bucket.rs b/sewup/src/kv/bucket.rs index d8daea84b..1cde16500 100644 --- a/sewup/src/kv/bucket.rs +++ b/sewup/src/kv/bucket.rs @@ -261,8 +261,18 @@ impl<'a, K: Key + PartialEq, V: Clone + Value> Bucket { } /// Pop the last item - pub fn pop_back(&self) -> Option> { - None + pub fn pop_back(&mut self) -> Option> { + let mut prev_pair: Option<(K, V)> = None; + let mut iter = self.iter(); + while let Some(pair) = iter.next() { + prev_pair = Some(pair); + } + if let Some((key, value)) = prev_pair { + self.remove(key.clone()); + Some((key, value)) + } else { + None + } } /// Pop the first item diff --git a/sewup/src/kv/tests.rs b/sewup/src/kv/tests.rs index f0561a50f..b224fe2ae 100644 --- a/sewup/src/kv/tests.rs +++ b/sewup/src/kv/tests.rs @@ -38,3 +38,21 @@ fn test_pop_for_bucket() { assert_eq!(bucket.get(2).unwrap(), None); assert_eq!(bucket.get(3).unwrap(), Some(3)); } + +#[cfg(feature = "default")] +#[test] +fn test_pop_back_for_bucket() { + let mut bucket = Bucket { + name: "test_bucket".into(), + raw_bucket: (vec![], vec![]), + phantom_k: PhantomData::, + phantom_v: PhantomData::, + }; + bucket.set(1, 1); + bucket.set(2, 2); + assert_eq!(bucket.get(1).unwrap(), Some(1)); + let last = bucket.pop_back(); + assert_eq!(last, Some((2, 2))); + assert_eq!(bucket.get(1).unwrap(), Some(1)); + assert_eq!(bucket.get(2).unwrap(), None); +}