@@ -88,10 +88,10 @@ public:
}
void test_flatmap_joins_lists() {
- std::vector<vec_t> vv{{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}, {5, 6, 7}};
+ vec_t vv{1, 2, 3, 4, 5};
+ auto next3 = [](int_t i) { return vec_t{i, i+1, i+2}; };
vec_t expected{1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6, 5, 6, 7};
- auto identity = [](int_t i) { return i; };
- auto s = stream::make_stream(vv).flatmap( identity );
+ auto s = stream::make_stream(vv).flatmap( next3 );
vec_t o{s.begin(), s.end()};
TS_ASSERT_EQUALS(expected, o);
@@ -69,6 +69,6 @@ namespace stream { namespace detail {
template <typename T>
template <typename F>
auto stream_base<T>::flatmap(F&& func) const -> stream_base<flatmap_f<F>> {
- return make_join((*this)).map(func);
+ return make_join((*this).map(func));
} }
@@ -58,25 +58,13 @@ namespace stream {
virtual ::stream::iterator<T> end() = 0;
};
- template <typename T, typename = void>
- struct has_value_type {
- template <typename F>
- using flatmap_f = void;
- };
-
- template <typename T>
- struct has_value_type<T, typename std::enable_if<!std::is_void<typename T::value_type>::value>::type> {
- using flatmap_f = decltype(std::declval<F>()(std::declval<typename T::value_type>()));
class stream_base {
private:
using map_f = decltype(std::declval<F>()(std::declval<T>()));
- using flatmap_f = typename has_value_type<T>::template flatmap_f<F>;
+ using flatmap_f = typename decltype(std::declval<F>()(std::declval<T>()))::value_type;
using self = stream_base<T>;
public: