Browse Source

Change fluent filter token to '%' instead of using type inspection on '|'

Sam Jaffe 5 years ago
parent
commit
93ff83028a
2 changed files with 17 additions and 10 deletions
  1. 2 4
      include/stream/streams/fluent.hpp
  2. 15 6
      test/stream_fluent_test.cxx

+ 2 - 4
include/stream/streams/fluent.hpp

@@ -30,9 +30,7 @@ namespace stream { namespace detail {
     return s.flatmap(f);
   }
 
-  template <
-      typename T, typename F,
-      typename = typename std::enable_if<!traits::is_filter<T, F>::value>::type>
+  template <typename T, typename F>
   auto operator|(stream_base<T> const & s, F && f) -> decltype(s.map(f)) {
     return s.map(f);
   }
@@ -40,7 +38,7 @@ namespace stream { namespace detail {
   template <
       typename T, typename P,
       typename = typename std::enable_if<traits::is_filter<T, P>::value>::type>
-  stream_base<T> operator|(stream_base<T> const & s, P && f) {
+  stream_base<T> operator%(stream_base<T> const & s, P && f) {
     return s.filter(f);
   }
 

+ 15 - 6
test/stream_fluent_test.cxx

@@ -40,28 +40,37 @@ TEST(FluentStreamTest, MapCanAlterValues) {
   EXPECT_THAT(s.collect(), Eq(expected));
 }
 
-TEST(FluentStreamTest, NoOpFilterReturnOriginal) {
+TEST(FluentStreamTest, CanMapElementToBool) {
   std::vector<int> input{1, 2, 3, 4, 5};
-  auto pass = [](int) { return true; };
-  auto s = stream::make_stream(input) | pass;
+  std::vector<bool> expected{false, true, false, true, false};
+  auto even = [](int i) { return i % 2 == 0; };
+  auto s = stream::make_stream(input) | even;
 
-  EXPECT_THAT(s.collect(), Eq(input));
+  EXPECT_THAT(s.collect(), Eq(expected));
 }
 
 TEST(FluentStreamTest, CanFilterOutElements) {
   std::vector<int> input{1, 2, 3, 4, 5};
   std::vector<int> expected{2, 4};
   auto even = [](int i) { return i % 2 == 0; };
-  auto s = stream::make_stream(input) | even;
+  auto s = stream::make_stream(input) % even;
 
   EXPECT_THAT(s.collect(), Eq(expected));
 }
 
+TEST(FluentStreamTest, NoOpFilterReturnOriginal) {
+  std::vector<int> input{1, 2, 3, 4, 5};
+  auto pass = [](int) { return true; };
+  auto s = stream::make_stream(input) % pass;
+
+  EXPECT_THAT(s.collect(), Eq(input));
+}
+
 TEST(FluentStreamTest, AccumulateDefaultsToAdd) {
   std::vector<int> input{1, 2, 3, 4, 5};
   auto even = [](int i) { return i % 2 == 0; };
   auto sum = [](int lhs, int rhs) { return lhs + rhs; };
-  auto s = stream::make_stream(input) | even;
+  auto s = stream::make_stream(input) % even;
   EXPECT_THAT(s > sum, Eq(6));
 }