Skip to main content

graphrecords_query/capabilities/arithmetic/
power.rs

1use crate::{AttributeName, Failure, IndexValue, Positional, QueryResult, Scalar, ValueDomain};
2use graphrecords_core::graphrecord::{EdgeIndex, GraphRecordValue, NodeIndex, datatypes::Pow};
3
4pub trait ValuePower: ValueDomain {
5    fn power<'a>(
6        label: &'static str,
7        value: Self::Value<'a>,
8        argument: Self::Value<'a>,
9    ) -> QueryResult<Self::Value<'a>>;
10}
11
12impl ValuePower for Scalar {
13    fn power<'a>(
14        label: &'static str,
15        value: Self::Value<'a>,
16        argument: Self::Value<'a>,
17    ) -> QueryResult<Self::Value<'a>> {
18        value
19            .pow(argument)
20            .map_err(|error| Failure::new(label, error))
21    }
22}
23
24impl ValuePower for AttributeName {
25    fn power<'a>(
26        label: &'static str,
27        value: Self::Value<'a>,
28        argument: Self::Value<'a>,
29    ) -> QueryResult<Self::Value<'a>> {
30        value
31            .pow(argument)
32            .map_err(|error| Failure::new(label, error))
33    }
34}
35
36impl ValuePower for IndexValue<Positional> {
37    fn power<'a>(
38        _label: &'static str,
39        value: Self::Value<'a>,
40        argument: Self::Value<'a>,
41    ) -> QueryResult<Self::Value<'a>> {
42        Ok(value.pow(argument as u32))
43    }
44}
45
46impl ValuePower for IndexValue<NodeIndex> {
47    fn power<'a>(
48        label: &'static str,
49        value: Self::Value<'a>,
50        argument: Self::Value<'a>,
51    ) -> QueryResult<Self::Value<'a>> {
52        value
53            .pow(argument)
54            .map_err(|error| Failure::new(label, error))
55    }
56}
57
58impl ValuePower for IndexValue<AttributeName> {
59    fn power<'a>(
60        label: &'static str,
61        value: Self::Value<'a>,
62        argument: Self::Value<'a>,
63    ) -> QueryResult<Self::Value<'a>> {
64        value
65            .pow(argument)
66            .map_err(|error| Failure::new(label, error))
67    }
68}
69
70impl ValuePower for IndexValue<EdgeIndex> {
71    fn power<'a>(
72        _label: &'static str,
73        value: Self::Value<'a>,
74        argument: Self::Value<'a>,
75    ) -> QueryResult<Self::Value<'a>> {
76        Ok(value.pow(argument))
77    }
78}
79
80impl ValuePower for IndexValue<GraphRecordValue> {
81    fn power<'a>(
82        label: &'static str,
83        value: Self::Value<'a>,
84        argument: Self::Value<'a>,
85    ) -> QueryResult<Self::Value<'a>> {
86        value
87            .pow(argument)
88            .map_err(|error| Failure::new(label, error))
89    }
90}