#![warn(missing_docs)]
#![crate_name="joinkit"]
#[macro_use]
extern crate clap;
extern crate itertools;
use std::iter::{IntoIterator};
use std::cmp::Ordering;
use std::hash::Hash;
pub use merge_join::{MergeJoinInner, MergeJoinLeftExcl, MergeJoinLeftOuter, MergeJoinFullOuter};
pub use hash_join::{HashJoinInner, HashJoinLeftExcl, HashJoinLeftOuter, HashJoinRightExcl,
HashJoinRightOuter, HashJoinFullOuter};
pub mod util;
mod merge_join;
mod hash_join;
#[derive(Clone, PartialEq, Eq, Debug)]
pub enum EitherOrBoth<L, R> {
Both(L, R),
Left(L),
Right(R),
}
pub trait Joinkit : Iterator {
fn merge_join_inner_by<R, F>(self, other: R, cmp: F) -> MergeJoinInner<Self, R::IntoIter, F>
where Self: Sized,
R: IntoIterator,
F: FnMut(&Self::Item, &R::Item) -> Ordering
{
MergeJoinInner::new(self, other.into_iter(), cmp)
}
fn merge_join_left_excl_by<R, F>(self, other: R, cmp: F)
-> MergeJoinLeftExcl<Self, R::IntoIter, F>
where Self: Sized,
R: IntoIterator,
F: FnMut(&Self::Item, &R::Item) -> Ordering
{
MergeJoinLeftExcl::new(self, other.into_iter(), cmp)
}
fn merge_join_left_outer_by<R, F>(self, other: R, cmp: F)
-> MergeJoinLeftOuter<Self, R::IntoIter, F>
where Self: Sized,
R: IntoIterator,
F: FnMut(&Self::Item, &R::Item) -> Ordering
{
MergeJoinLeftOuter::new(self, other.into_iter(), cmp)
}
fn merge_join_full_outer_by<R, F>(self, other: R, cmp: F)
-> MergeJoinFullOuter<Self, R::IntoIter, F>
where Self: Sized,
R: IntoIterator,
F: FnMut(&Self::Item, &R::Item) -> Ordering
{
MergeJoinFullOuter::new(self, other.into_iter(), cmp)
}
fn hash_join_inner<K, RI, RV>(self, other: RI) -> HashJoinInner<Self, K, RV>
where Self: Sized,
K: Hash + Eq,
RV: Clone,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinInner::new(self, other)
}
fn hash_join_left_excl<K, RI, RV>(self, other: RI) -> HashJoinLeftExcl<Self, K>
where Self: Sized,
K: Hash + Eq,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinLeftExcl::new(self, other)
}
fn hash_join_left_outer<K, RI, RV>(self, other: RI) -> HashJoinLeftOuter<Self, K, RV>
where Self: Sized,
K: Hash + Eq,
RV: Clone,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinLeftOuter::new(self, other)
}
fn hash_join_right_excl<K, RI, RV>(self, other: RI) -> HashJoinRightExcl<Self, K, RV>
where Self: Sized,
K: Hash + Eq,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinRightExcl::new(self, other)
}
fn hash_join_right_outer<K, RI, RV>(self, other: RI) -> HashJoinRightOuter<Self, K, RV>
where Self: Sized,
K: Hash + Eq,
RV: Clone,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinRightOuter::new(self, other)
}
fn hash_join_full_outer<K, RI, RV>(self, other: RI) -> HashJoinFullOuter<Self, K, RV>
where Self: Sized,
K: Hash + Eq,
RV: Clone,
RI: IntoIterator<Item=(K, RV)>
{
HashJoinFullOuter::new(self, other)
}
}
impl<T: ?Sized> Joinkit for T where T: Iterator { }