use arrow::array::Array;
use crate::Error;
pub trait Transform {
type Source: Array;
type Target: Array;
fn transform(&self, source: &Self::Source) -> Result<Self::Target, Error>;
fn then<T2>(self, next: T2) -> Compose<Self, T2>
where
Self: Sized,
T2: Transform<Source = Self::Target>,
{
Compose {
first: self,
second: next,
}
}
}
#[derive(Clone)]
pub struct Compose<T1, T2> {
first: T1,
second: T2,
}
impl<T1, T2, M> Transform for Compose<T1, T2>
where
T1: Transform<Target = M>,
T2: Transform<Source = M>,
M: Array,
{
type Source = T1::Source;
type Target = T2::Target;
fn transform(&self, source: &Self::Source) -> Result<Self::Target, Error> {
let mid = self.first.transform(source)?;
self.second.transform(&mid)
}
}