toolshed 0.8.1

Arena allocator and a handful of useful data structures
Documentation
use serde::ser::{Serialize, Serializer};
use crate::list::List;
use crate::map::{Map, BloomMap};
use crate::set::{Set, BloomSet};

impl<'arena, T> Serialize for List<'arena, T>
where
    T: Serialize
{
    #[inline]
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer
    {
        serializer.collect_seq(self.iter())
    }
}

impl<'arena, K, V> Serialize for Map<'arena, K, V>
where
    K: Serialize,
    V: Serialize + Copy,
{
    #[inline]
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer
    {
        serializer.collect_map(self.iter())
    }
}

impl<'arena, K, V> Serialize for BloomMap<'arena, K, V>
where
    K: Serialize,
    V: Serialize + Copy,
{
    #[inline]
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer
    {
        serializer.collect_map(self.iter())
    }
}

impl<'arena, I> Serialize for Set<'arena, I>
where
    I: Serialize,
{
    #[inline]
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer
    {
        serializer.collect_seq(self.iter())
    }
}

impl<'arena, I> Serialize for BloomSet<'arena, I>
where
    I: Serialize,
{
    #[inline]
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer
    {
        serializer.collect_seq(self.iter())
    }
}

#[cfg(test)]
mod test {
    use super::*;
    use serde_json;
    use crate::Arena;

    #[test]
    fn list_can_be_serialized() {
        let arena = Arena::new();
        let list = List::from_iter(&arena, ["doge", "to", "the", "moon!"].iter().cloned());
        let json = serde_json::to_string(&list).unwrap();

        assert_eq!(json, r#"["doge","to","the","moon!"]"#);
    }

    #[test]
    fn map_can_be_serialized() {
        let arena = Arena::new();
        let map = Map::new();

        map.insert(&arena, "foo", 10u64);
        map.insert(&arena, "bar", 20);
        map.insert(&arena, "doge", 30);

        let json = serde_json::to_string(&map).unwrap();

        assert_eq!(json, r#"{"foo":10,"bar":20,"doge":30}"#);
    }

    #[test]
    fn bloom_map_can_be_serialized() {
        let arena = Arena::new();
        let map = BloomMap::new();

        map.insert(&arena, "foo", 10u64);
        map.insert(&arena, "bar", 20);
        map.insert(&arena, "doge", 30);

        let json = serde_json::to_string(&map).unwrap();

        assert_eq!(json, r#"{"foo":10,"bar":20,"doge":30}"#);
    }

    #[test]
    fn set_can_be_serialized() {
        let arena = Arena::new();
        let set = Set::new();

        set.insert(&arena, "foo");
        set.insert(&arena, "bar");
        set.insert(&arena, "doge");

        let json = serde_json::to_string(&set).unwrap();

        assert_eq!(json, r#"["foo","bar","doge"]"#);
    }

    #[test]
    fn bloom_set_can_be_serialized() {
        let arena = Arena::new();
        let set = BloomSet::new();

        set.insert(&arena, "foo");
        set.insert(&arena, "bar");
        set.insert(&arena, "doge");

        let json = serde_json::to_string(&set).unwrap();

        assert_eq!(json, r#"["foo","bar","doge"]"#);
    }
}