graphrecords_query/capabilities/arithmetic/
power.rs1use 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}