64 ENDPOINTS aEndpoints, EMIT aEmit )
70 [&]( std::span<EDGE> aRange )
72 std::sort( aRange.begin(), aRange.end(), aLess );
74 for(
const EDGE& edge : aRange )
76 const auto [u, v] = aEndpoints( edge );
78 if( aForest.
Unite( u, v ) )
89 [&]( std::span<EDGE> aRange ) -> std::span<EDGE>
91 auto end = std::partition( aRange.begin(), aRange.end(),
92 [&](
const EDGE& aEdge )
94 const auto [u, v] = aEndpoints( aEdge );
96 return !aForest.Connected( u, v );
99 return aRange.subspan( 0, std::distance( aRange.begin(),
end ) );
103 [&](
auto&& aSelf, std::span<EDGE> aRange ) ->
void
117 size_t mid = aRange.size() / 2;
118 std::nth_element( aRange.begin(), aRange.begin() + mid, aRange.end(), aLess );
120 aSelf( aSelf, aRange.subspan( 0, mid ) );
125 aSelf( aSelf,
filter( aRange.subspan( mid ) ) );
128 recurse( recurse, aEdges );