namespace std::ranges {
  template<class R, class P>
  concept compatible-joinable-ranges =            
      common_with<range_value_t<R>, range_value_t<P>> &&
      common_reference_with<range_reference_t<R>, range_reference_t<P>> &&
      common_reference_with<range_rvalue_reference_t<R>, range_rvalue_reference_t<P>>;
  template<class R>
  concept bidirectional-common = bidirectional_range<R> && common_range<R>;    
  template<input_range V, forward_range Pattern>
    requires view<V> && input_range<range_reference_t<V>>
          && view<Pattern>
          && compatible-joinable-ranges<range_reference_t<V>, Pattern>
  class join_with_view : public view_interface<join_with_view<V, Pattern>> {
    using InnerRng = range_reference_t<V>;                  
    V base_ = V();                                          
    non-propagating-cache<iterator_t<V>> outer_it_;         
                                                            
    non-propagating-cache<remove_cv_t<InnerRng>> inner_;   
                                                            
    Pattern pattern_ = Pattern();                           
    
    template<bool Const> struct iterator;                   
    
    template<bool Const> struct sentinel;                   
  public:
    join_with_view()
      requires default_initializable<V> && default_initializable<Pattern> = default;
    constexpr explicit join_with_view(V base, Pattern pattern);
    template<input_range R>
      requires constructible_from<V, views::all_t<R>> &&
               constructible_from<Pattern, single_view<range_value_t<InnerRng>>>
    constexpr explicit join_with_view(R&& r, range_value_t<InnerRng> e);
    constexpr V base() const & requires copy_constructible<V> { return base_; }
    constexpr V base() && { return std::move(base_); }
    constexpr auto begin() {
      if constexpr (forward_range<V>) {
        constexpr bool use_const =
          simple-view<V> && is_reference_v<InnerRng> && simple-view<Pattern>;
        return iterator<use_const>{*this, ranges::begin(base_)};
      }
      else {
        outer_it_ = ranges::begin(base_);
        return iterator<false>{*this};
      }
    }
    constexpr auto begin() const
      requires forward_range<const V> &&
               forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> {
      return iterator<true>{*this, ranges::begin(base_)};
    }
    constexpr auto end() {
      if constexpr (forward_range<V> &&
                    is_reference_v<InnerRng> && forward_range<InnerRng> &&
                    common_range<V> && common_range<InnerRng>)
        return iterator<simple-view<V> && simple-view<Pattern>>{*this, ranges::end(base_)};
      else
        return sentinel<simple-view<V> && simple-view<Pattern>>{*this};
    }
    constexpr auto end() const
      requires forward_range<const V> && forward_range<const Pattern> &&
               is_reference_v<range_reference_t<const V>> &&
               input_range<range_reference_t<const V>> {
      using InnerConstRng = range_reference_t<const V>;
      if constexpr (forward_range<InnerConstRng> &&
                    common_range<const V> && common_range<InnerConstRng>)
        return iterator<true>{*this, ranges::end(base_)};
      else
        return sentinel<true>{*this};
    }
  };
  template<class R, class P>
    join_with_view(R&&, P&&) -> join_with_view<views::all_t<R>, views::all_t<P>>;
  template<input_range R>
    join_with_view(R&&, range_value_t<range_reference_t<R>>)
      -> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>;
}
 constexpr explicit join_with_view(V base, Pattern pattern);
Effects: Initializes 
base_ with 
std::move(base) and
pattern_ with 
std::move(pattern). Effects: Initializes 
base_ with 
views::all(std::forward<R>(r)) and
pattern_ with 
views::single(std::move(e)).