use std::sync::Arc;
mod any_vec;
mod read_only_clone;
mod readable;
mod transform;
mod typed;
pub use transform::*;
use crate::{ReadableBoxedVec, VecIndex, VecValue, Version};
pub type ComputeFrom1<I, T, S1T> = fn(I, S1T) -> T;
#[derive(Clone)]
pub struct LazyVecFrom1<I, T, S1I, S1T>
where
S1I: VecIndex,
S1T: VecValue,
{
pub(super) name: Arc<str>,
pub(super) base_version: Version,
pub(super) source: ReadableBoxedVec<S1I, S1T>,
pub(super) compute: ComputeFrom1<I, T, S1T>,
}
impl<I, T, S1I, S1T> LazyVecFrom1<I, T, S1I, S1T>
where
I: VecIndex,
T: VecValue,
S1I: VecIndex,
S1T: VecValue,
{
pub fn init(
name: &str,
version: Version,
source: ReadableBoxedVec<S1I, S1T>,
compute: ComputeFrom1<I, T, S1T>,
) -> Self {
assert_eq!(
I::to_string(),
S1I::to_string(),
"LazyVecFrom1 index type mismatch: expected {}, got {}",
I::to_string(),
S1I::to_string()
);
Self {
name: Arc::from(name),
base_version: version,
source,
compute,
}
}
}
impl<I, T, S1T> LazyVecFrom1<I, T, I, S1T>
where
I: VecIndex,
T: VecValue,
S1T: VecValue,
{
pub fn transformed<F: UnaryTransform<S1T, T>>(
name: &str,
version: Version,
source: ReadableBoxedVec<I, S1T>,
) -> Self {
Self::init(name, version, source, |_, v| F::apply(v))
}
}