4#include "Stroika/Foundation/Containers/SortedMapping.h" 
    8namespace Stroika::Foundation::Traversal {
 
   12    template <Traversal::IRange RANGETYPE, Common::IPotentiallyComparer<
typename RANGETYPE::value_type> RANGE_ELT_COMPARER>
 
   13    inline bool IsPartition (
const Iterable<RANGETYPE>& iterable, RANGE_ELT_COMPARER comparer)
 
   15        using Common::KeyValuePair;
 
   16        using Containers::SortedMapping;
 
   17        using Debug::TraceContextBumper;
 
   18        TraceContextBumper ctx{
"IsPartition_Helper_"};
 
   19        using namespace Traversal;
 
   20        using value_type = 
typename RANGETYPE::value_type;
 
   21        SortedMapping<value_type, RANGETYPE> tmp;
 
   22        for (
const RANGETYPE& r : iterable) {
 
   23            tmp.Add (r.GetLowerBound (), r);
 
   25        optional<value_type> upperBoundSeenSoFar;
 
   26        Openness             upperBoundSeenSoFarOpenness{};
 
   27        for (
const KeyValuePair<value_type, RANGETYPE>& i : tmp) {
 
   29            if (upperBoundSeenSoFar) {
 
   30                if (not comparer (*upperBoundSeenSoFar, i.fValue.GetLowerBound ())) {
 
   35                if (upperBoundSeenSoFarOpenness == i.fValue.GetLowerBoundOpenness ()) {
 
   41            upperBoundSeenSoFar         = i.fValue.GetUpperBound ();
 
   42            upperBoundSeenSoFarOpenness = i.fValue.GetUpperBoundOpenness ();
 
   46    template <Traversal::IRange RANGETYPE>
 
   50            iterable, [] (
typename RANGETYPE::value_type lhs, 
typename RANGETYPE::value_type rhs) { 
return Math::NearlyEquals (lhs, rhs); });
 
 
bool IsPartition(const Iterable< RANGETYPE > &iterable)
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.