1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use std::{collections::HashMap, hash::Hash};

use crate::{
    core::{CreationContext, Op, Output, Relation},
    Dynamic, Save,
};

use super::map::{ExtremaMap, KVMap};

pub type DynamicOutput<'a, D, M = HashMap<D, isize>> = Output<D, Dynamic<'a, (D, isize)>, M>;
pub type CollectionOutput<'a, D, M = HashMap<D, isize>> =
    Output<D, Save<Dynamic<'a, (D, isize)>>, M>;

impl<C: Op> Relation<C> {
    pub fn into_output(self, context: &CreationContext) -> Output<C::D, C>
    where
        C::D: Eq + Hash,
    {
        self.into_output_(context)
    }
}

impl<K, V, C: Op<D = (K, V)>> Relation<C> {
    pub fn into_kv_output(self, context: &CreationContext) -> Output<(K, V), C, KVMap<K, V>>
    where
        K: Eq + Hash,
        V: Eq + Hash,
    {
        self.into_output_(context)
    }
    pub fn into_extrema_output(
        self,
        context: &CreationContext,
    ) -> Output<(K, V), C, ExtremaMap<K, V>>
    where
        K: Ord,
        V: Eq + Hash,
    {
        self.into_output_(context)
    }
}