use crate::tst_map::{self, TSTMap};
use std::fmt::{self, Debug};
use std::iter::{Map, FromIterator};
#[derive(Clone, PartialEq, Eq)]
pub struct TSTSet {
map: TSTMap<()>,
}
#[derive(Clone)]
pub struct Iter<'a> {
iter: Map<tst_map::Iter<'a, ()>, fn((String, &'a ())) -> String>
}
pub struct IntoIter {
iter: Map<tst_map::IntoIter<()>, fn((String, ())) -> String>
}
#[derive(Clone)]
pub struct WildCardIter<'a> {
iter: Map<tst_map::WildCardIter<'a, ()>, fn( (String, &'a () )) -> String>,
}
impl TSTSet {
pub fn new() -> Self { Default::default() }
pub fn len(&self) -> usize { self.map.len() }
pub fn is_empty(&self) -> bool { self.len() == 0 }
pub fn clear(&mut self) {
self.map.clear()
}
pub fn contains(&self, key: &str) -> bool {
self.map.contains_key(key)
}
pub fn insert(&mut self, key: &str) -> bool {
self.map.insert(key, ()).is_none()
}
pub fn remove(&mut self, key: &str) -> bool {
self.map.remove(key).is_some()
}
pub fn iter(&self) -> Iter {
fn first<A, B>((a, _): (A, B)) -> A { a }
Iter { iter: self.map.iter().map(first) }
}
pub fn wildcard_iter(&self, pat: &str) -> WildCardIter {
fn first<A, B>((a, _): (A, B)) -> A { a }
WildCardIter { iter: self.map.wildcard_iter(pat).map(first) }
}
pub fn longest_prefix<'a>(&self, pref: &'a str) -> &'a str {
self.map.longest_prefix(pref)
}
pub fn prefix_iter(&self, pref: &str) -> Iter {
fn first<A, B>((a, _): (A, B)) -> A { a }
Iter { iter: self.map.prefix_iter(pref).map(first) }
}
}
impl IntoIterator for TSTSet {
type Item = String;
type IntoIter = IntoIter;
fn into_iter(self) -> IntoIter {
fn first<A, B>((a, _): (A, B)) -> A { a }
IntoIter { iter: self.map.into_iter().map(first) }
}
}
impl<'x> FromIterator<&'x str> for TSTSet {
fn from_iter<I: IntoIterator<Item = &'x str>>(iter: I) -> TSTSet {
let mut set = TSTSet::new();
for item in iter {
set.insert(item);
}
set
}
}
impl<'x> Extend<&'x str> for TSTSet {
#[inline]
fn extend<I: IntoIterator<Item=&'x str>>(&mut self, iter: I) {
for k in iter {
self.insert(k);
}
}
}
impl Default for TSTSet {
fn default() -> Self {
TSTSet { map: Default::default() }
}
}
impl Debug for TSTSet {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_set().entries(self.iter()).finish()
}
}
impl<'a> Iterator for Iter<'a> {
type Item = String;
fn next(&mut self) -> Option<String> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl Iterator for IntoIter {
type Item = String;
fn next(&mut self) -> Option<String> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}
impl ExactSizeIterator for IntoIter {
fn len(&self) -> usize { self.iter.len() }
}
impl<'a> Iterator for WildCardIter<'a> {
type Item = String;
fn next(&mut self) -> Option<String> { self.iter.next() }
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}