graphrecords_query/element/
shape.rs1use crate::{
2 BareValueDomain, IndexDomain, QueryResult, ReturnValueDomain, Unit, ValueDomain, element::Arity,
3};
4use std::marker::PhantomData;
5
6pub trait ElementShape: 'static {
7 type Element<'a>: 'a;
8
9 type ValueDomain: ValueDomain;
10}
11
12pub trait ReturnShape: ElementShape {
13 type ReturnElement<'a>: 'a;
14
15 fn into_return_element(element: Self::Element<'_>) -> Self::ReturnElement<'_>;
16}
17
18pub struct Indexed<K: IndexDomain, V: ValueDomain>(PhantomData<(K, V)>);
19pub struct Bare<V: BareValueDomain>(PhantomData<V>);
20
21impl<K: IndexDomain, V: ValueDomain> ElementShape for Indexed<K, V> {
22 type Element<'a> = (K::Index<'a>, QueryResult<V::Value<'a>>);
23 type ValueDomain = V;
24}
25impl<V: BareValueDomain> ElementShape for Bare<V> {
26 type Element<'a> = QueryResult<V::Value<'a>>;
27 type ValueDomain = V;
28}
29
30impl<K: IndexDomain, V: ReturnValueDomain> ReturnShape for Indexed<K, V> {
31 type ReturnElement<'a> = (K::Index<'a>, QueryResult<V::Value<'a>>);
32
33 fn into_return_element(element: Self::Element<'_>) -> Self::ReturnElement<'_> {
34 element
35 }
36}
37
38impl<K: IndexDomain> ReturnShape for Indexed<K, Unit> {
39 type ReturnElement<'a> = QueryResult<K::Owned>;
40
41 fn into_return_element(element: Self::Element<'_>) -> Self::ReturnElement<'_> {
42 let (index, value) = element;
43
44 value.map(|()| K::to_owned(&index))
45 }
46}
47
48impl<V: BareValueDomain + ReturnValueDomain> ReturnShape for Bare<V> {
49 type ReturnElement<'a> = QueryResult<V::Value<'a>>;
50
51 fn into_return_element(element: Self::Element<'_>) -> Self::ReturnElement<'_> {
52 element
53 }
54}
55
56pub type Return<'a, S, C> = <C as Arity>::Container<'a, <S as ElementShape>::Element<'a>>;