pub fn symmetric_hash_join_into_iter<'a, Key, I1, V1, I2, V2, LhsState, RhsState>(
    lhs: I1,
    rhs: I2,
    lhs_state: &'a mut LhsState,
    rhs_state: &'a mut RhsState,
    is_new_tick: bool
) -> impl 'a + Iterator<Item = (Key, (V1, V2))>
where Key: 'a + Eq + Hash + Clone, V1: 'a + Clone, V2: 'a + Clone, I1: 'a + Iterator<Item = (Key, V1)>, I2: 'a + Iterator<Item = (Key, V2)>, LhsState: HalfJoinState<Key, V1, V2>, RhsState: HalfJoinState<Key, V2, V1>,