pub use vec::SeekableVec;
pub trait Seekable: Sized {
- type Key: Ord;
+ type Key;
type Value;
fn next(&mut self) -> Option<(Self::Key, Self::Value)>;
fn merge<L>(iter: L) -> Merger<Self>
where
L: Iterator<Item = Self>,
+ Self::Key: Ord,
{
merge::merge(iter)
}
fn coalesce<F>(self, cf: F) -> Coalesce<Self, F>
where
F: FnMut(&Self::Key, Self::Value, Self::Value) -> Self::Value,
+ Self::Key: PartialEq,
{
coalesce::coalesce(self, cf)
}
impl<S, F> IntoIterator for Coalesce<S, F>
where
S: Seekable,
+ S::Key: PartialEq,
F: FnMut(&S::Key, S::Value, S::Value) -> S::Value,
{
type Item = (S::Key, S::Value);
impl<S, F> Seekable for Coalesce<S, F>
where
S: Seekable,
+ S::Key: PartialEq,
F: FnMut(&S::Key, S::Value, S::Value) -> S::Value,
{
type Key = S::Key;
pub struct Merger<S>
where
S: Seekable,
+ S::Key: Ord,
{
active: BinaryHeap<MergerEnt<S>>,
ended: Vec<S>,
}
-struct MergerEnt<S: Seekable> {
+struct MergerEnt<S: Seekable>
+where
+ S::Key: Ord,
+{
cur_item: RefCell<(S::Key, S::Value)>,
rest: S,
}
-impl<S: Seekable> Eq for MergerEnt<S> {}
-impl<S: Seekable> PartialEq for MergerEnt<S> {
+impl<S: Seekable> Eq for MergerEnt<S> where S::Key: Ord {}
+impl<S: Seekable> PartialEq for MergerEnt<S>
+where
+ S::Key: Ord,
+{
fn eq(&self, other: &Self) -> bool {
let sent = self.cur_item.borrow();
let oent = other.cur_item.borrow();
// for MergerEnt<S> vs. S::Key. We do this instead of using
// std::cmp::Reverse to avoid the additional packing/unpacking
// boilerplate.
-impl<S: Seekable> PartialOrd for MergerEnt<S> {
+impl<S: Seekable> PartialOrd for MergerEnt<S>
+where
+ S::Key: Ord,
+{
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
- Some(self.cmp(other))
+ Some(self.cmp(other))
}
}
-impl<S: Seekable> Ord for MergerEnt<S> {
+impl<S: Seekable> Ord for MergerEnt<S>
+where
+ S::Key: Ord,
+{
fn cmp(&self, other: &Self) -> Ordering {
let sent = self.cur_item.borrow();
let oent = other.cur_item.borrow();
}
}
-impl<S: Seekable> MergerEnt<S> {
+impl<S: Seekable> MergerEnt<S>
+where
+ S::Key: Ord,
+{
fn new(mut source: S) -> Option<MergerEnt<S>> {
Some(MergerEnt {
cur_item: RefCell::new(source.next()?),
where
L: Iterator<Item = S>,
S: Seekable,
+ S::Key: Ord,
{
Merger {
active: BinaryHeap::from(
}
}
-impl<S: Seekable> IntoIterator for Merger<S> {
+impl<S: Seekable> IntoIterator for Merger<S>
+where
+ S::Key: Ord,
+{
type Item = (S::Key, S::Value);
type IntoIter = Iter<Self>;
fn into_iter(self) -> Self::IntoIter {
}
}
-fn heap_reset<S: Seekable>(m: &mut Merger<S>, key: &S::Key) {
+fn heap_reset<S: Seekable>(m: &mut Merger<S>, key: &S::Key)
+where
+ S::Key: Ord,
+{
let mut active = Vec::<MergerEnt<S>>::new();
let mut ended = Vec::<S>::new();
while let Some(e) = m.active.pop() {
}
// forward seek within the heap
-fn heap_seek<S: Seekable>(m: &mut Merger<S>, key: &S::Key) -> Option<()> {
+fn heap_seek<S: Seekable>(m: &mut Merger<S>, key: &S::Key) -> Option<()>
+where
+ S::Key: Ord,
+{
loop {
let mut head = m.active.peek_mut()?;
if head.cur_item.borrow().0 >= *key {
None
}
-impl<S: Seekable> Seekable for Merger<S> {
+impl<S: Seekable> Seekable for Merger<S>
+where
+ S::Key: Ord,
+{
type Key = S::Key;
type Value = S::Value;