graphrecords-query 0.5.0

High-performance graph-based data records
Documentation
use crate::{AttributeName, Failure, IndexValue, Positional, QueryResult, Scalar, ValueDomain};
use graphrecords_core::graphrecord::{EdgeIndex, GraphRecordValue, NodeIndex, datatypes::Pow};

pub trait ValuePower: ValueDomain {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>>;
}

impl ValuePower for Scalar {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        value
            .pow(argument)
            .map_err(|error| Failure::new(label, error))
    }
}

impl ValuePower for AttributeName {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        value
            .pow(argument)
            .map_err(|error| Failure::new(label, error))
    }
}

impl ValuePower for IndexValue<Positional> {
    fn power<'a>(
        _label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        Ok(value.pow(argument as u32))
    }
}

impl ValuePower for IndexValue<NodeIndex> {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        value
            .pow(argument)
            .map_err(|error| Failure::new(label, error))
    }
}

impl ValuePower for IndexValue<AttributeName> {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        value
            .pow(argument)
            .map_err(|error| Failure::new(label, error))
    }
}

impl ValuePower for IndexValue<EdgeIndex> {
    fn power<'a>(
        _label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        Ok(value.pow(argument))
    }
}

impl ValuePower for IndexValue<GraphRecordValue> {
    fn power<'a>(
        label: &'static str,
        value: Self::Value<'a>,
        argument: Self::Value<'a>,
    ) -> QueryResult<Self::Value<'a>> {
        value
            .pow(argument)
            .map_err(|error| Failure::new(label, error))
    }
}