1 // revisions: default miropt
3 //[miropt]compile-flags: -Z mir-opt-level=3
4 // -^ This flag is for #96395 as a regression test.
6 mod convenience_operators {
7 use crate::{Op, Relation};
8 use std::ops::AddAssign;
11 impl<C: Op> Relation<C> {
12 pub fn map<F: Fn(C::D) -> D2 + 'static, D2: 'static>(
15 ) -> Relation<impl Op<D = D2, R = C::R>> {
16 self.map_dr(move |x, r| (f(x), r))
20 impl<K: 'static, V: 'static, C: Op<D = (K, V)>> Relation<C> {
21 pub fn semijoin<C2: Op<D = K, R = R2>, R2, R3: AddAssign<R3>>(
24 ) -> Relation<impl Op<D = C::D, R = R3>>
26 C::R: Mul<R2, Output = R3>,
28 self.join(other.map(|x| (x, ()))).map(|(k, x, ())| (k, x))
37 use crate::core::Relation;
38 use std::ops::{AddAssign, Mul};
44 LC: Op<D = (K, LD), R = LR>,
45 RC: Op<D = (K, RD), R = RR>,
48 LR: AddAssign<LR> + Mul<RR, Output = OR>,
57 impl<K: 'static, D: 'static, C: Op<D = (K, D)>> Relation<C> {
58 pub fn join<C2: Op<D = (K, D2)>, D2: 'static, OR: AddAssign<OR>>(
61 ) -> Relation<impl Op<D = (K, D, D2), R = OR>>
63 C::R: Mul<C2::R, Output = OR>,
76 use crate::core::Relation;
77 use std::ops::AddAssign;
87 C: Op<D = D1, R = R1>,
88 MF: Fn(D1, R1) -> (D2, R2),
94 impl<C: Op> Relation<C> {
95 pub fn map_dr<F: Fn(C::D, C::R) -> (D2, R2), D2: 'static, R2: AddAssign<R2>>(
98 ) -> Relation<impl Op<D = D2, R = R2>> {
108 use std::ops::AddAssign;
111 type R: AddAssign<Self::R>;
114 pub use self::operator::Op;
116 pub struct Relation<C> {
122 pub use self::core::Relation;