Skip to main content

graphrecords_query/element/
shape.rs

1use 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>>;